##六.进制转换
问题7:将M(2<=M)进制的数X转换为N(N<=36)进制的数输出
#include<stdio.h>
#include<string>
#define maxDigits 100
struct bigInterger{
int digit[masDigits];
int size;
void init(){
for(int i = 0;i < maxDigits;i++) size = 0;
}
void set(int x){ //用普通整数初始化高精度整数
init();
do{
digit[size++] = x % 10000;
x/=10000;
}while(x!=0);
}
void output(){
for(int i = size-1;i>=0;i--){
if(i!=size-1) printf("%04d",digit[i]);
else printf("%d",digit[i]);
}
printf("\n");
}
bigInteger operator * (int x) const{//高精度整数与普通整数的乘积
bigInteger ret;
ret.init();
int carry = 0;
for(int i = 0;i < size;i++){
int tmp = x*digit[i] + carry;
carry =tmp/10000;
tmp%=10000;
ret.digit[ret.size++] = tmp;
}
if(carry!=0){
ret.digit[ret.size++] = carry;
}
return ret;
}
bigInteger operator + (const bigInterger &A) const{//高精度整数之间的加法运算
bigInteger ret;
ret.init();
int carry = 0;
for(int i = 0;i < size;i++){
int tmp = A.digit[i] + digit[i] + carry;
carry = tmp/10000;
tmp %= 10000;
ret.digit[ret.size++] = tmp;
}
if(carry!=0){
ret.digit[ret.size++] = carry;
}
return ret;
}
bigInteger operator * (int x) const{//高精度整数除以普通整数
bigInteger ret;
ret.init();
int remainder = 0;
for(int i = size-1;i>=0;i--){
int t = (remainder*10000+digit[i])/x;
int r = (remainder*10000+digit[i])%x;
ret.digit[i] = t;//保存本位的值
remainder = r;//保存至本位为止的余数
}
ret.size = 0;//返回高精度整数的size初始值为0,即当所有位数字都为0时,digit[0]代表数字0,作为最高有效位,高精度整数即为数字0
for(int i = 0;i<maxDigits;i++){
if(digit[i] != 0;) ret.size = i;
}//若存在非0位,则最高位的非0位作为最高有效位
ret.size++;//最高有效位的下一位即为下一个不曾使用的digit数组单元,确定为size的值
return ret;
}
int operator % (int x) const{ //高精度整数对普通整数求余数
int operator = 0;
for(int i = size - 1;i >= 0;i--){
int t = (remainder*10000+digit[i])/x;
int r = (remainder*10000+digit[i])%x;
remiander = x;
}//过程同高精度整数对普通整数求商
return remainder;
}
}a,b,c;
char str[10000];
char ans[10000];
int main(){
int n,m;
while(scanf("%d%d",&m,&n) != EOF){
scanf("%s",str); //输入m进制数
int L = strlen(str);
a.set(0);//a初始值为0,用来保存转换成十进制的m进制数
b.set(1);//b初始值为1,在m进制转换为十进制过程中依次代表每一位权重
for(int i = L-1;i >= 0;i--){
int t;
if(str[i]>='0' && str[i]<='9'){
t = str[i] - '0';//转换为十进制
}
else t = str[i] - 'A' + 10;//确定当前字符代表的数字
a = a+b*t;//累加当前数字乘当前位权重的积
b = b*m;//计算下一位权重
}
int size = 0;//代表转化为n进制后的字符个数
do{
int t = a % n;
if(t >= 10) ans[size++] = t - 10 + 'a';
else ans[size++] = t + '0';
a = a/n;
}while(a.digit[0] != 0 || a.size != 1);
for(int i = size - 1;i >= 0;i--) printf("%c",ans[i]);
printf("\n");
}
return 0;
}
注意:高精度整数不能再在常数时间里得到结果,由于其高精度运算需要计算每一位的和,所以该运算复杂度变为O(size),其中size为两个数中较多的位数