天天看点

用c++实现大整数的二进制转换//written by jmh

//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;
}