首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

问个想不明白的算法,该怎么解决

2012-02-21 
问个想不明白的算法判断C(n,k)(0≤k≤n2^31)的奇偶性input:n,koutput:奇/偶mn-kcnt0while(n0){cnt+n

问个想不明白的算法
判断C(n,   k)   (0   ≤   k   ≤   n   <   2^31)的奇偶性
input:   n,   k
output:   奇/偶
m   =   n   -   k;
cnt   =   0;
while   (n   >   0)
{
cnt   +=   n   > >   1;
n   > > =   1;
}
while   (m   >   0)
{
cnt   -=   m   > >   1;
m   > > =   1;
}
while   (k   >   0)
{
cnt   -=   k   > >   1;
k   > > =   1;
}
if   (cnt   >   0)
printf( "偶 ");
else
printf( "奇 ");


想了好久想不通为什么,那位达人给点数学上的证明或提示?谢谢!

[解决办法]
其算法原理如下:
首先, 一个数可以表示为 2^x * y 其中 x> =0, y某一奇数
m = n-k

C(n, k) = n!/((n-k)! * k!) = n!/(m!*k!)

n! 表示为 2^x * y , 其中 x= n/2 + n/4 + n/8 + n/16 ....

热点排行