ZOJ 2417

题意

给出一个十进制数,找出其二进制数,找到其中从低位开始,第一个为1的数,然后把从这个数到最低位组成的二进制数的十进制数写出来

思路

尊重十进制数到二进制数的换算方法,然后判断一下是否是到了第一个为1的数
从二进制数换算成十进制数利用常规方法,参考我的一篇日志:
参考内容

关于十进制转换为二进制数的介绍:

你以十进制的数除以你所要转换的进制数,把每次除得的余数记在旁边,所得的商数继续除以进制数,直到余数为0时止.例如你要把100转换成八进制: 
100/8=12...(余数为4); 
12/8=1.....(余数为4); 
1/8=0......(余数为1); 
然后把相应的余数从低向高顺着写出来,如上的为144,此即为100的八进制表示形式. 
十进制转换为十六进制与二进制与前面的转化为八进制相同,如100转换为十六进制: 
100/16=6....(余数为4); 
6/16=0......(余数为6); 
同理则以十六进制表示的100形式为64; 
100转换为二进制: 
100/2=50....(余数为0); 
50/2=25.....(余数为0); 
25/2=12.....(余数为1); 
12/2=6......(余数为0); 
6/2=3.......(余数为0); 
3/2=1.......(余数为1); 
1/2=0.......(余数为1); 
所以100的二进制表示形式为1100100; 

这个题我们就只需要做到,找出这个二进制数,然后把它转换为10进制数即可了。附上代码及详细解释

代码

//ZOJ 2417
#include <iostream>
using namespace std;
int main(){
    int n,num[10];
    while(cin>>n && n){
        int pos =0;
        while(n){
            num[pos] = n%2;
            n/=2;     //这里用来记录二进制数
            if(num[pos]==1){   //找到第一个为1的位
                int sum=0;    //sum用来记录输出值
                for(int i=pos;i>=0;i--){   //算出十进制数
                    sum = sum*2+num[i];
                    //cout<<num[i]<<" ";
                }
                cout<<sum<<endl;
                break;
            }
            pos++;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值