题目:7-47 二进制的前导的零

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

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

输入格式:

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

输出格式:

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

输入样例:

256

输出样例:

23

解题思路:

  1. 二进制每一位(digit)代表的数值为2^{digit - 1}
  2. 将十进制(num)转化为二进制:在二进制中,先找到代表数值刚好大于 num 的位数,将其前一位取 1,之后再按此方式循环累加
  3. 按上述方式,只要能找到第一个取1的位置(digit),那么这一位往前均为前导0,即 32-digit
  4. 为了方便累加,原始数值是从 1 开始的,所以要对 0 的情况单独处理
  5. 对 n 为负数的情况进行单独处理

Tip:n存在为负数的情况,此时最左边(符号位)为1,表示负数

#include <stdio.h>

int main()
{
    int n = 0, digits = 1, num = 1;
    scanf("%d", &n);
    while(num < n)
    {
       	num *= 2;   //二进制进位
        digits++;   //二进制位数
    }
	if(n == 0) digits = 0;    //n为0的特殊情况
	if(n < 0) digits = 32;    //n为负数的情况
    printf("%d", 32 - digits);
    
    return 0;
}

 题目来源:PTA(中M22春C、Java入门练习)【作者:翁恺;单位:浙江大学】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值