數的進制轉換
兩個進制之間的直接轉換
題目鏈接
Describe:
撰寫一個程式,可以實作將一個數字由一個進制轉換為另一個進制,
這里有 62 個不同數位 {0?9,A?Z,a?z},
輸入格式
第一行輸入一個整數,代表接下來的行數,
接下來每一行都包含三個數字,首先是輸入進制(十進制表示),然后是輸出進制(十進制表示),最后是用輸入進制表示的輸入數字,數字之間用空格隔開,
輸入進制和輸出進制都在 2 到 62 的范圍之內,
(在十進制下)A=10,B=11,…,Z=35,a=36,b=37,…,z=61 (0?9 仍然表示 0?9),
輸出格式
對于每一組進制轉換,程式的輸出都由三行構成,
第一行包含兩個數字,首先是輸入進制(十進制表示),然后是用輸入進制表示的輸入數字,
第二行包含兩個數字,首先是輸出進制(十進制表示),然后是用輸出進制表示的輸入數字,
第三行為空白行,
同一行內數字用空格隔開,
輸入樣例:
8
62 2 abcdefghiz
10 16 1234567890123456789012345678901234567890
16 35 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 23 333YMHOUE8JPLT7OX6K9FYCQ8A
23 49 946B9AA02MI37E3D3MMJ4G7BL2F05
49 61 1VbDkSIMJL3JjRgAdlUfcaWj
61 5 dl9MDSWqwHjDnToKcsWE1S
5 10 42104444441001414401221302402201233340311104212022133030
輸出樣例:
62 abcdefghiz
2 11011100000100010111110010010110011111001001100011010010001
10 1234567890123456789012345678901234567890
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 333YMHOUE8JPLT7OX6K9FYCQ8A
35 333YMHOUE8JPLT7OX6K9FYCQ8A
23 946B9AA02MI37E3D3MMJ4G7BL2F05
23 946B9AA02MI37E3D3MMJ4G7BL2F05
49 1VbDkSIMJL3JjRgAdlUfcaWj
49 1VbDkSIMJL3JjRgAdlUfcaWj
61 dl9MDSWqwHjDnToKcsWE1S
61 dl9MDSWqwHjDnToKcsWE1S
5 42104444441001414401221302402201233340311104212022133030
5 42104444441001414401221302402201233340311104212022133030
10 1234567890123456789012345678901234567890
題解:假設把這樣一個數x.x.x從a進制轉到b進制,

對a進制x的每一次運算的余數就是對x每一次運算的b進制的一個末位,下圖展示一次運算的程序(獲取b進制個位的程序),

舉個例子123從四進制轉化為五進制

有一些細節不多說了,代碼如下:
#include <algorithm>
#include <cstring>
#include <iostream>
#include<vector>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int a,b;
string a_l,b_l;
cin>>a>>b>>a_l;
vector<int> number;
for(auto c:a_l)
{
if(c>='0'&&c<='9') number.push_back(c-'0');
if(c>='A'&&c<='Z') number.push_back(c-'A'+10);
if(c>='a'&&c<='z') number.push_back(c-'a'+36);
}
reverse(number.begin(),number.end());//倒一下消除最高位的那個0
vector<int> res; //比如 123 例子中 011 的那個0
while(number.size())
{
int r=0;//余數
for(int i=number.size()-1;i>=0;i--)
{
number[i]+=r*a;
r=number[i]%b;//r作用于下一次操作*進制(上一行)
number[i]/=b;
}
res.push_back(r);
while(number.size()&&number.back()==0) number.pop_back();//這就體現最開始那個reverse的作用了,去掉一開始那個0
}
reverse(res.begin(),res.end());
for(auto x:res)
{
if(x<=9) b_l+=char(x+'0');
if(x>=10&&x<=35) b_l+=char(x-10+'A');
if(x>=36) b_l+=char(x-36+'a');
}
cout<<a<<" "<<a_l<<endl;
cout<<b<<" "<<b_l<<endl;
cout<<endl;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/267443.html
標籤:其他
上一篇:博弈論手記
