正整数的任意进制转换
时间限制: 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 进制数。
样例输入
6 18,2345678A123,18 15,23456,18 12,2345678,20 16,12345678,23 25,3456AB,21 18,AB1234567,22
样例输出
2345678A123 114E0 22B7A4 21A976L 7C2136 22JF0G367
用普通的进制转换思维就可以了
AC代码:
1 #include <string> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 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++) 9 #define frd0(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 else 33 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 else 52 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 }