统计一个数的二进制表示时,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
参考
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
参考

1727

被折叠的 条评论
为什么被折叠?



