正整数的任意进制转换

正整数的任意进制转换

时间限制: 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 }
进制

 

posted @ 2019-06-21 15:07  LHR-LHR  阅读(805)  评论(0编辑  收藏  举报