大数进制转换
最间在写一道大数题的时候被卡了一下,所以准备整理一下大数的运算,先整理大数的进制转换.
进制转换的重点是被转换数不断被余被除,一般范围的整数转换可以直接用 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;
}
如果我的文章哪里有错误、不足或者难以理解的地方欢迎评论或私聊我.