时间限制: 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 代码:
- #include <string>
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- #define frn1(i,x,n) for (int i=x;i<=n;i++)
- #define fdn1(i,x,n) for (int i=x;i>=n;i--)
- #define frn0(i,x,n) for (int i=x;i<n;i++)
- #define frd0(i,x,n) for (int i=x;i>n;i--)
- using namespace std;
- int n,a[61],b[191],len;
- string s;
- void ex_change(int p,int q)
- {
- int tot=0,k=1;
- while (k<=len)
- {
- int stp=0;
- frn1(i,k,len)
- {
- int tmp=(stp*p+a[i]);
- a[i]=tmp/q;
- stp=tmp%q;
- }
- b[++tot]=stp;
- while(!a[k] && k<=len)
- k++;
- }
- frd0(i,tot,0)
- if (b[i]<10)
- printf("%d",b[i]);
- else
- printf("%c",char(b[i]+55));
- puts("");
- }
- int main()
- {
- scanf("%d",&n);
- while (n--)
- {
- cin>>s;
- int p=0,k,q=0;len=0;
- for (int i=0;s[i]!=',';k=++i)
- {
- p=p*10+s[i]-48;
- k=i;
- }
- for (int i=k+1;s[i]!=',';k=++i)
- if (s[i]>='0' && s[i]<='9')
- a[++len]=s[i]-48;
- else
- a[++len]=s[i]-55;
- frn0(i,k+1,s.size())
- q=q*10+s[i]-48;
- ex_change(p,q);
- }
- return 0;
- }
进制
来源: http://www.bubuko.com/infodetail-3099341.html