1) n位二进制中1的个数
PS : 用到位运算;
#include<stdio.h>
int main(){
int n,res;
while(scanf("%d",&n)&&n)
{
res=0;
while(n)
{
res += n&1;
n >>= 1;
}
printf("%d\n",res);
}
return 0;
}
2) n^n 的结果中最低位1的位置
n^n的结果中有一个2二进制低位就会多一个0(可以联想十进制转换为二进制时的过程;除2,能整除,则余数为0,二进制中就多了一个0),所以问题转换为n^n中有多少个2的问题;
所以,只需要执行下面的程序就能得到n^n中2的个数;下面的程序能计算出n^n中2的个数;
PS : : 这种方法,也是计算n^n中某一质因子个数的方法;
#include<stdio.h>
int main()
{
int n,count;
while(scanf("%d",&n)&&n)
{
count=0;
while(n)
{
n >>= 1;
count += n;
}
printf("%d\n",count);
}
return 0;
}
因为结果是末尾0的个数,所以 结果在加上1,就是最低位1的下标啦;
3) n^n的阶乘中末尾0的个数;
首先考虑,如果N!= K×10^M,且K不能被10整除,那么N!末尾有M个0。再考虑对N!进行质因数分解,N!=(2^x)×(3^y)×(5^z)…,由于10 = 2×5,所以M只跟X和Z相关,每一对2和5相乘可以得到一个10,于是M = min(X, Z)。不难看出X大于等于Z,因为能被2整除的数出现的频率比能被5整除的数高得多,所以把公式简化为M = Z。
问题有转换为了求n^n的结果中 5 的个数,所以,运行下面的程序,可以得到结果;
while(n)
{
n /=5;
res += n;
}
printf("%d\n",res);