题目1080:进制转换
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2561
解决:503
-
题目描述:
-
将M进制的数X转换为N进制的数输出。
-
输入:
-
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
-
输出:
-
输出X的N进制表示的数。
-
样例输入:
-
16 10 F
-
样例输出:
-
15
-
提示:
-
输入时字母部分为大写,输出时为小写,并且有大数据。
#include<stdio.h> #include<cstring> #include<string> using namespace std; struct biginteger{ int digit[100]; int size; void init(){ for(int i=0;i<100;++i) digit[i]=0; 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("%d",digit[i]); else printf("%04d",digit[i]); } printf("\n"); } biginteger operator +(const biginteger &x)const{ biginteger ret; ret.init(); int c=0; //表示进位 for(int i=0;i<x.size ||i<size;++i){ int tmp=x.digit[i]+digit[i]+c; c=tmp/10000; tmp%=10000; ret.digit[ret.size++]=tmp; } if(c!=0) ret.digit[ret.size++]=c; return ret; } biginteger operator *(int x)const{ biginteger ret; ret.init(); int sum,c=0; for(int i=0;i<size;++i){ sum=x*digit[i]+c; c=sum/10000; sum%=10000; ret.digit[ret.size++]=sum; } if(c!=0) ret.digit[ret.size++]=c; return ret; } biginteger operator /(int x)const{ //大数据/x biginteger ret; ret.init(); int i,j,t; int reminder=0; for(i=size-1;i>=0;--i){ t=(reminder*10000+digit[i])/x; j=(reminder*10000+digit[i])%x; ret.digit[i]=t;//保存高位 reminder=j;//余数 } for(i=size-1;i>=0;--i){ //因为处罚高位可能有0的存在 if(ret.digit[i]!=0){ ret.size=i; break; } } ret.size++; return ret; } int operator %(int x)const{ int reminder=0,i,t,j; for(i=size-1;i>=0;--i){ t=(reminder*10000+digit[i])/x; j=(reminder*10000+digit[i])%x; reminder=j; } return reminder; } }a,b,c; char str[10000]; char buf[10000]; //先转换成十进制数然后再进行进制转换 int main(){ int m,n,i,len; int sum,ans; while(scanf("%d %d",&m,&n)!=EOF){ //将m进制的x转化成n进制 scanf("%s",str); a.init(); a.set(0); //a中存放转换的十进制数 b.set(1); //b中存放权重 len=strlen(str); for(i=len-1;i>=0;--i){ if(str[i]>='0'&&str[i]<='9') ans=str[i]-'0'; else ans=str[i]-'A'+10; a=a+b*ans; b=b*m; } int size=0; do{ int t=a%n; if(t>=10) buf[size++]=t-10+'a'; else buf[size++]=t+'0'; a=a/n; }while(a.digit[0]!=0 || a.size!=1); for(i=size-1;i>=0;--i) printf("%c",buf[i]); printf("\n"); } return 0; }