小赵常常觉得时间不够用。在学习操作系统和计算机组成原理等课程的时候,经常遇到2进制8进制16进制等需要转换成10进制来方便计算,然后有需要再转换成相应的进制。小赵想不如我来做一个进制转换的程序,非常好做,又可以节省时间。
作为小赵的好朋友,请你来帮他做这件事。
输入
本题有多组测试数据,处理到文件结束。
每组数据首先是两个数字n,m。n代表输入数字的进制,m代表输出数字的进制。(2<=n,m<=62)
接下来一行是一个字符串,表示n进制下的数字。字符串保证表示的值在C语言64位整型(即long long int)范围内。字符串由0~9,a~z,A~Z组成。
a~z标志10到35,A~Z标志36到61。
输出
每组数据输出一行,用一个字符串表示的转换为m进制之后的值。
样例输入 Copy
10 16 10 10 62 62
样例输出 Copy
a 10
题目大意:就是说给你n进制下的一个字符串转换到m进制
简单模拟,可以先转为10进制,再由10进制转为m进制。
坑点:数字0(10 10 0)(就是任意进制下的0,转换到任意进制都是0)
AC代码
#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;} typedef long long ll; const int maxn = 1e6+10; char a[maxn]; char b[maxn]; int main() { ll n,m,k; char pp='0'; while(~scanf("%lld%lld",&n,&m)){ scanf("%s",a); ll l=strlen(a); if(strcmp(a,"0")==0){ printf("%c ",pp); continue; } ll sum=0;//输入转化后 ll j=0; ll p; for(int i=l-1;i>=0;i--){ if(a[i]>='a'&&a[i]<='z'){ p=a[i]-'a'+10; } else if(a[i]>='A'&&a[i]<='Z'){ p=a[i]-'A'+36; } else{ p=a[i]-'0'; } sum+=p*pow(n,j); j++; } ll y=0; while(sum){ ll x=sum%m; if(x<10){ b[y++]=(x+'0'); } else if(x>=10&&x<=35){ b[y++]=(x-10+'a'); } else if(x>=36&&x<=61){ b[y++]=(x-36+'A'); } sum/=m; } for(int i=y-1;i>=0;i--){//注意b数组逆序输出 printf("%c",b[i]); } printf(" "); } return 0; }