统计1的个数

统计一个数的二进制表示时,1的个数。
int
 func(x)
{
    
int  countx  =   0 ;
    
while (x)
    
{
        countx
++ ;
        x 
=  x & (x - 1 );
    }

    
return  countx;
}
 

给定一个十进制数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有"1"的个数。
 例如:
 N=2,写下1,2。这样只出现了1个"1"
 N=12,写下 1,2,3,4,5,6,7,8,9,10,11,12。这样"1"的个数是5
 请写出一个函数,返回1到N之间出现"1"的个数,比如 f(12)=5


直接了当的作法:
main()
{
int n,y,x;
scanf("%d",&n);
y=f(n);
printf("%d",y);
}
int f(int n)
{
int j,i,y=0;
for(i=1;i<=n;i++)
{
 j=i;
 while(j!=0)
 {
 if(j%10==1) y++;
 j=j/10;
 }
}
return y;
}
高效的作法:
 这种方法分别分析N的每一位上1出现的可能性,读者可以自己按照归纳的思想分析一下,最终你会得出 一个结论,就是通过分析N而不是遍历1到N的每一个数就可以得出答案,如果N的长度为Len的话这种 算法的复杂度为O (Len)。 发现规律为
 * 1. 如果位数上为0,1的数目由该位以上的数决定,并乘以该位的分位 比如百位上是0,高位上是14则百位上出现1的数目
        为 14*100。
 * 2. 如果位数上为1,1的数目由高位和低位共同决定。 比如高位是14低位是112,则百位出现1的数目为 14×100+(112+1) 
* 3. 如果位数上大于1,则百位出现1的数目为 (14+1)×100

参考
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值