-
题目描述:
-
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
-
输入:
-
输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。
。n保证是int范围内的一个整数。
-
输出:
-
对应每个测试案例,
输出一个整数,代表输入的那个数中1的个数。
-
-
样例输入:
-
3 4 5 -1
-
样例输出:
-
1 2 32
-
解法:如果用每次&1判断最低位是不是1,然后左移1位除以2,知道原数为空这种常规方法适用于正整数,如果是负数就会死循环。应采用如下方法,附OJ AC代码:
-
#include <stdio.h> /* 将原数与二进制flag = 1 , 10 , 100 ,1000。。。与 */ int NumberOf1No1(int n ) { int count = 0 ; unsigned int flag = 1; while (flag) { if(n&flag) count++; flag = flag<<1; } return count ; } /* 整数中有几个1 就循环几次,推荐 */ int NumberOf1No2(int n ) { int count = 0 ; while(n) { ++ count ; n = (n - 1 ) & n ; } return count ; } void main() { int n , i , num; while(scanf("%d",&n)!=EOF) { for(i = 0 ; i < n ; i++) { scanf("%d",&num); printf("%d\n",NumberOf1No2(num)); } } // printf("%d",NumberOf1No2(63)); } /************************************************************** Problem: 1513 User: tcals Language: C Result: Accepted Time:80 ms Memory:912 kb ****************************************************************/