正整數的任意進制轉換

正整數的任意進制轉換

時間限制: 1 Sec  內存限制: 128 MB

題目描述

將 p 進制 n 轉換爲 q 進制。p 和 q 的取值範圍爲[2,36],其中,用到的數碼按從小到大依次爲:0,1,2,3,4,5,6,7,8,9,A,B,...,Z,不考慮小寫字母。 ios

 

輸入

一共1+m 行: 
1行爲 m,表示後面有 m 行(1 <= m <= 60). 
其後的m行中,每行3個數: 進制p,p進制數n,以及進制 q。 
三個數之間用逗號間隔。
n 的長度不超過50位。ide

 

輸出

轉換後的 q 進制數。spa

 

樣例輸入

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

 用普通的進制轉換思惟就能夠了code

AC代碼:blog

 

 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 }
進制
相關文章
相關標籤/搜索