PTA 7-47 二进制的前导的零

计算机内部用二进制来表达所有的值。一个十进制的数字,比如24,在一个32位的计算机内部被表达为00000000000000000000000000011000。可以看到,从左边数过来,在第一个1之前,有27个0。我们把这些0称作前导的零。

现在,你的任务是写一个程序,输入一个整数,输出在32位表达下它前导的零的个数。

输入格式:

一个整数,在32位的整数可以表达的范围内。

输出格式:

一个整数,表达输入被表达为一个32位的二进制数时,在第一个1之前的0的数量。

输入样例:

256

输出样例:

23

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

需要注意两点:首位是符号位,负数的第一位为1;如果像下面的代码用i作乘方与输入比较进行位数确定,i可能超出Int范围,在测试时会显示超时,故i需要用long long形式

#include<stdio.h>

int main()
{
	int x;
	long long int i = 1; // 作为参考可能会超过int范围,在本程序中可能到 2^31 
	int cnt = 0;
	scanf("%d", &x); 
	while( x>=i ){
		cnt ++; // 记录转化为二进制时会占多少位 
		i *= 2;  
	}
	cnt = 32 - cnt; // 计算0的个数
	if( x<0 ){ // 首位是符号位,负数首位是1 
		cnt = 0;
	}
	printf("%d", cnt);
	return 0; 
 } 

也可以用除法来确定位数

#include<stdio.h>

int main()
{
	int x;
	int cnt = 32; // 前导0的个数 
	scanf("%d", &x);
	if( x<0 ) cnt = 0;  // 负数首位是1 
	else{ // 自然数的前导0计算 
		while( x!=0 ){
			x /= 2;
			cnt --;
		} 
	}
	printf("%d", cnt);
	return 0; 
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值