今天遇到一个非常有意思的题目
题目如下:
#include <stdio.h>
int func(int x)
{
int countx=0;
while(x)
{
countx++;
x=x&(x-1);
}
return countx;
}
int main()
{
int i = func(12345);
printf("i=%d",i);
getch();//窗口保留函数,调试使用
return 0;
}
输出结果:
这道题该怎么算呢?
一开始我的做法是把它换成二进制,然后按照x&(x-1)去算。
通过计算我发现每一次进行x&(x-1)的计算就会把二进制数的最低位的1给去除掉。
所以它的规律就是:把二进制数(从低位到高位依次)变为0,直到把所有的1都变成0,然后退出循环。
那么countx的值就很好确定了。它原本是算循环的次数,而循环次数取决于二进制数1的个数,所以这个程序本质就是在计算十进制数转换为二进制数后1的个数。
那么下次遇到这个题目,只需把十进制数转换为二进制数,然后数二进制数里面1的个数即可。