统计
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
给出一个十进制正整数n,将它化为32位的二进制(32-bit binary)求出它低位上第一次出现1的位置求出它高位连续0的个数求出它低位连续0的个数求出它所有1的个数
-
输入
-
第一行一个正整数T表示测试数据的组数
接下来T行,每行一个正整数表示n (1 <= n <= 2^32 - 1)
输出
- 一行四个整数,按照题目描述依次输出,参照output 样例输入
-
3 1 100 123456
样例输出
-
1 31 0 1 3 25 2 3 7 15 6 6
-
第一行一个正整数T表示测试数据的组数
熟悉二进制的转化,然后对每个数进行处理统计就可以了,唯一需要注意的是用64位整形的...........
也是醉了,以后看来这样的题,直接就64 位做吧,被抗死了这么多次也是够了...........
#include<stdio.h>
int low_one,high_zero,cnt_one;
void slove(long long x)
{
int kase=0;
low_one=high_zero=cnt_one=0;//能注意到输出的第一个数和第三个数相差 1
while(x)
{
if(x%2==0&&!kase)
{
++low_one;//统计最后零的数量
}
if(x&1)
{
kase=1;//变量标记,证明已经出现过 1 了....
++cnt_one;
}
++high_zero;//去掉位数之后就是最高位的 0 的数量......
x/=2;
}
printf("%d %d %d %d\n",low_one+1,32-high_zero,low_one,cnt_one);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long x;//注意!!!
scanf("%lld",&x);
slove(x);
}
return 0;
}