大数进制转换 最间在写一道大数题的时候被卡了一下,所以准备整理一下大数的运算,先整理大数的进制转换. 进制转换的重点是被转换数不断被余被除,一般范围的整数转换可以直接用 a%b,a/b 来解决. int 范围的十进制转二进制
#include<iostream> using namespace std; int main() { int a; int c[100]={0};//储存二进制 while(cin>>a) { int i=0; while(a)//a大于0还能除 { c[i++]=a%2;//获得余数并且i加一 a=a/2; } for(i--;i>=0;i--)//逆序输出 { cout<<c[i]; } cout<<endl; } return 0; }但在大数情况下就要人工模拟余和除的过程. 由于转换过程中需要用到大数除和余. 为了方便理解,先了解一下数学原理. 除法原理是以迭代算法对两个变量进行移位、加减得到商和余数. 举个500/2的例子 模拟除法:
250 ---- 2)500 4 //无法整除则余数给下一位 --- 10 //第二位运算时的数为上一位的余数*当前进制+该位上的数 10 --- 0 从左向右(由高位到低位)的运算.10的二进制转换的过程
2|_10___ 0 2|_5___ 1 2|_2__ 0 2|_1_ 1 得到1010 不断得获得余数 先余的是低位,后余的是高位大数的输入一定是字符串,为了运算方便先将字符串转换成数字.
int c[10000];//储存数字 void toNum() { memset(c,0,sizeof(c));//初始化 for(int i=0;a[i]!='\0';i++) { c[i]=a[i]-'0'; } }模拟人工除和余, 不断获得余数. (该代码为十进制转二进制) (可以增加两个参数作为新旧进制,然后替换文中的10和2,就可以任意转换10以下的进制).
#include<iostream> #include<cstring> using namespace std; char a[10000];//存放输入的字符串 char b[10000];//存放输出的字符串,十进制以下都可以用int,但以防万一本处使用字符串 int c[10000];//储存数字形式的大数 void toNum()//将字符串转换成数字 { memset(c,0,sizeof(c));//初始化 for(int i=0;a[i]!='\0';i++) { c[i]=a[i]-'0'; } } int main() { while(cin>>a)//输入大数 { toNum(); memset(b,0,sizeof(b)); int k=1;//验证被转换数是否除尽 int y=0;//余数 int v=0;//正在转换位数 while(k) { k=0;//初始化 y=0; for(int i=0;a[i]!='\0';i++)//a与c的长度一样,用a来表示长度 {//这一个循环相当于c%2,c/2 y=y*10+c[i];//确定该位运算时的数字,上一位的余数*进制数+该位数值 if(y>0)//c还不为0 k=1; c[i]=y/2;//得到这位除后的数字 y=y%2;//获得这位除后的余数 } //最后的y就是c%2的值 //c是一轮除后的新值 b[v++]='0'+y;//放置余数 } //由于是用k来判断是否除尽,所以k=0时,y=0,所以最后的b[v-1]一定是0,可以舍去. for(int i=v-2;i>=0;i--)//逆序输出转换后的进制数 { cout<<b[i]; } cout<<endl; } return 0; }如果我的文章哪里有错误、不足或者难以理解的地方欢迎评论或私聊我.