将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。

题目描述:
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。

思想:从大往小进位
本题思考点在于从大到小进位。算法的核心三行相当于执行了我们平常的除法。

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;

/*
示例:输入123
 1 % 2 = 1;		//将余数传给下一位
 1 / 2 = 0;      //百位数变为0 
 k = 1;
 
 12 % 2 = 0;
 12 / 2 = 6;
 k = 0;			//没有余数给下一位,被整除

 3 % 2 = 1;
 3 / 2 = 1;
 k = 1;       //剩余61         一轮结束,将k保存到b
 
 61 % 2 = 1;
 61 / 2 = 30;
 k = 1;

 11 % 2 = 1;
 11 / 2 = 5;
 k = 1;       //剩余30          两轮结束,将k保存到b

 3 % 2 = 1;
 3 / 2 = 1;
 k = 1;
 
 10 % 2 = 0;
 10 / 2 = 5;
 k = 0 ;       //剩余15			三轮结束,将k保存到b

 1 % 2 = 1;
 1 / 2 = 0;
 k = 1;
 
 15 % 2 = 1;
 15 / 2 = 7;
 k = 1;        //剩余7			四轮结束,将k保存到b

 7 % 2 = 1;
 7 / 2 = 3;
 k = 1;         //剩余3			五轮结束,将k保存到b

 3 % 2 = 1;
 3 / 2 = 1;
 k = 1;         //剩余1			六轮结束,将k保存到b

1 % 2 = 1;
1 / 2 = 0;
k = 1;         //0				七轮结束,将k保存到b

所得b数列为   1101111
将所得数组反过来 1111011 
*/ 
string conversion(int m, string a, int n){
    int l = a.length(), k;
    string b = "";
    for(int i = 0; i < l; ){                         //塞入数字
        k = 0;
        //求商求余
        for(int j = i; j < l; j++){
            int t = (k * m + a[j] - '0') % n;
            a[j] = (k * m + a[j] - '0') / n + '0';
            k = t;
        }
        b += char(k + '0');
        while(a[i] == '0') i++;
    } 
    reverse(b.begin(), b.end());		//反过来
    return b;
}
int main(){
    string a, b;
    while(cin >> a){
        b = conversion(10, a, 2);
        cout << b << endl;   
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值