n位二进制中1和0的有关问题

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);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值