正整数的任意进制转换
时间限制: 1 Sec 内存限制: 128 MB题目描述
将 p 进制 n 转换为 q 进制。p 和 q 的取值范围为[2,36],其中,用到的数码按从小到大依次为:0,1,2,3,4,5,6,7,8,9,A,B,...,Z,不考虑小写字母。
输入
一共1+m 行:
1行为 m,表示后面有 m 行(1 <= m <= 60). 其后的m行中,每行3个数: 进制p,p进制数n,以及进制 q。 三个数之间用逗号间隔。n 的长度不超过50位。
输出
转换后的 q 进制数。
样例输入
618,2345678A123,1815,23456,1812,2345678,2016,12345678,2325,3456AB,2118,AB1234567,22
样例输出
2345678A123114E022B7A421A976L7C213622JF0G367
用普通的进制转换思维就可以了
AC代码:
1 #include2 #include 3 #include 4 #include 5 #include 6 #define frn1(i,x,n) for (int i=x;i<=n;i++) 7 #define fdn1(i,x,n) for (int i=x;i>=n;i--) 8 #define frn0(i,x,n) for (int i=x;i n;i--)10 using namespace std;11 int n,a[61],b[191],len;12 string s;13 void ex_change(int p,int q)14 {15 int tot=0,k=1;16 while (k<=len)17 {18 int stp=0;19 frn1(i,k,len)20 {21 int tmp=(stp*p+a[i]);22 a[i]=tmp/q;23 stp=tmp%q;24 }25 b[++tot]=stp;26 while(!a[k] && k<=len)27 k++;28 }29 frd0(i,tot,0)30 if (b[i]<10)31 printf("%d",b[i]);32 else33 printf("%c",char(b[i]+55));34 puts("");35 }36 int main()37 {38 scanf("%d",&n);39 while (n--)40 {41 cin>>s;42 int p=0,k,q=0;len=0;43 for (int i=0;s[i]!=',';k=++i)44 {45 p=p*10+s[i]-48;46 k=i;47 }48 for (int i=k+1;s[i]!=',';k=++i)49 if (s[i]>='0' && s[i]<='9')50 a[++len]=s[i]-48;51 else52 a[++len]=s[i]-55;53 frn0(i,k+1,s.size())54 q=q*10+s[i]-48;55 ex_change(p,q);56 }57 return 0;58 }