- 题目描述:
-
将M进制的数X转换为N进制的数输出。
- 输入:
-
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
- 输出:
-
输出X的N进制表示的数。
- 样例输入:
-
16 10 F
- 样例输出:
-
15
#include <iostream> #include<cstdio> #include<string.h> #define MaxDigits 100 using namespace std; struct bigInteger{//高精度整数结构体 int digit[MaxDigits]; int size; void init(){//初始化 memset(digit,0,sizeof(digit)); 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]); } } 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 bigInteger &A) const{//高精度整数之间的加法 bigInteger ret; ret.init(); int carry=0; for(int i=0;i<A.size || 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;//计算当前位数值加上高位剩余的余数的和对x求得的商 int r=(remainder*10000+digit[i])%x;//计算当前位数值加上高位剩余的余数的和对x求模后得的余数 ret.digit[i]=t;//保存本位的值 remainder=r;//保存至本位为止的余数 } ret.size=0; for(int i=0;i<MaxDigits;i++){ if(digit[i]!=0) ret.size=i; } ret.size++;//计算ret的大小 return ret; } int operator % (int x) const{//高精度整数对普通整数求余数 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; remainder=r; } return remainder; } }a,b,c; char str[10000]; char ans[10000]; int main() { int n,m; scanf("%d %d",&n,&m); scanf("%s",str); 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{//对转换后的十进制数求其n进制值 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(" "); return 0; }