Description:
将十进制整数转换成二进制数。Input:
输入数据中含有不多于50个整数n(-2^31<n<2^31)。Output:
对于每个n,以11位的宽度右对齐输出n值,然后输出“-->”,再然后输出二进制数。每个整数n的输出,独立占一行。Sample Input:
2
0
-12
1
Sample Output:
2-->10
0-->0
-12-->-1100
1-->1
题解:
本题采用“除2取余,逆序排列”的方法:用2整除输入的十进制整数,商为q1,余数为r1,若余数非零即余数为1,在字符串s尾端添加0,若余数为0,在字符串s尾端添加1;然后再用2整除q1,得到商q2、余数r2......直到商为0,结束运算。倒置字符串s,然后输出,即为要求的二进制数。
为什么要逆序排列呢?
假设十进制整数A化得的二进制数为edcba 的形式,按权展开, 得:
A=a(2^0)+b(2^1)+c(2^2)+d(2^3)+e(2^4)
除以基数2,得:
A/2=a(2^0)/2+b(2^1)/2+c(2^2)/2+d(2^3)/2+e(2^4)/2
余数:
只有a不能整除2,所以余数为a;而其他因式都是2的倍数,能被2整除。
商得:
b(2^0)+c(2^1)+d(2^2)+e(2^3),再除以基数2余下了b,以此类推。
当这个数不能再被2除时,先余掉的a位数在原数低,而后来的余数数位高,所以要把所有的余数反过来写
,正好是edcba。
学习链接:http://baike.baidu.com/link?url=mbaCudHK8FQvWgO-nkvJM1g8i7y1baM9DtMfLDoxaRiyYWsFShP-c3Iyq5JpFlUQPMizphadERUWrGcsv7Fqt_
代码:
#include <iostream>
#include <algorithm>//reverse函数需要用到
using namespace std;
string s;
int main()
{
int n;
while(cin>>n)
{
if(n==0)
{
cout<<" 0-->0\n";//因为输出是11位右对齐,所以0前面要有10个空格
continue;
}
s="";
for(int a=n;a;a=a/2)//a==0时stop
{
s=s+(a%2?'1':'0');
}
std::reverse(s.begin(),s.end());//将字符串倒置
cout.width(11);//输出宽度为11
cout<<n<<(n<0?"-->-":"-->")<<s<<"\n";
}
return 0;
}