//written by jmh
发现网上的大整数转二进制的代码大多没有注释。。非常晦涩难懂,所以写了一遍精简的
变量shang为大整数每一位(从左开始)对2求的单个商,shang_sum为商的和,output用于存二进制结果,于为每一次循环最后一位对2的余数,若还嫌不够大可以把数组定义为longlong。
思路:
1)用字符数组存十进制数和二进制数
2)进制转换还是使用除2得余法,先顺序存储每次的余数,再反转。
3)至于除余运算:
t [ ] 是十进制数
c位高位余数,初值为0,
遍历t [ i ] ,新的进位c0=(t[i]+c*10)%2
新的t[ i ] = (t[i]+c*10)/2
c=c0;
遍历结束的c就是整个数除以2 的余数,而t【】是商
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
string a;
int input[32];int output[1000],j;
int shang,shang_sum,yu,k;
while (cin>>a)
{
int len=a.length();
for(int i=0;i<len;i++)
{
input[i]=a[i]-'0';
//cout<<input[i]<<" ";
}
memset(output,0,sizeof(output));
shang_sum=1;k=0;shang=0;
while(shang_sum)
{
shang_sum=0;
//cout<<shang_sum;
for(int i=0;i<len;i++)
{
j=i+1;
shang=input[i]/2;
//cout<<i;
shang_sum+=shang;
yu=input[i]%2;
if(i==(len-1))output[k++]=yu;
else input[j]+=yu*10;
input[i]=shang;
}
//int b=0;
//cout<<b++<<"*";
//cout<<k<<"*";
}
if(k==0)cout<<0;
else
{
for(int i=k-1;i>=0;i--)
{
cout<<output[i];
}
}
cout<<endl;
}
return 0;
}