NUMBER BASE CONVERSION(進位制轉換) 經典模擬

PI_PJW發表於2020-10-07

一.題目

把A進位制數轉化為B進位制輸出,一共有62種數字:
0 − 9 , A − Z , a − z 0-9,A-Z,a-z 09,AZ,az

Input

輸入的第一行是一個整數 T T T表示資料組數.
每組資料一行,分別是輸入的進位制 A A A(以10進製表示),輸出的進位制 B B B(以10進製表示),要轉換的數(以 A A A進製表示).
保證 2 ≤ A , B ≤ 62 2≤A,B≤62 2A,B62.
62 62 62進位制中, 0 0 0代表 0 0 0 A A A代表 10 10 10 a a a代表 36 36 36.

Output

每組資料輸出三行.
第一行輸出 A A A(以 10 10 10進製表示)和要轉換的數(以 A A A進製表示),中間一個空格隔開。
第二行輸出 B B B(以 10 10 10進製表示)和要轉換的數(以 B B B進製表示),中間一個空格隔開。
第三行輸出一個空行。
傳送門

二.Solution

這道題目十分經典,可能在很多題目中出現。
有的人用高精度過了,我尋思這要用高精度嗎?(其實是不會打)
做法:
首先預處理出’a’~‘z’與’A’ ~'Z’的大小,存下來方便一些

for (int i = '0'; i <= '9'; i ++)
	num[i] = i - '0', cha[num[i]] = i;
for (int i = 'a'; i <= 'z'; i ++)
	num[i] = 36 + i - 'a', cha[num[i]] = i;
for (int i = 'A'; i <= 'Z'; i ++)
	num[i] = 10 + i - 'A', cha[num[i]] = i;

我們先將每一位轉化為十進位制先存下來,注意這裡的每一位可以不是個位數,我只是想把所給陣列的每一位處理一下,方便後面的步驟:

for (int i = 0; i < lens; i ++){
	S[i] = num[s[lens - i - 1]];
}

然後進入正題。
我們先觀察一個十進位制數56怎麼給他轉換成3進位制數:
我們從最高位開始:5%3=2,2是這一位的餘數,就要將其乘上進位制10加在下一位上去,這一位保留5/3=1,就變成了{1}{26},然後到最後一位進行這樣的操作就變成了{1}{8}+2,那麼加的那個2就是轉換後的最低位;
繼續這樣進行變成{0}{6}+0+2,再來{0}{2}+0+0+2,最後再來一次{0}{0}+2+0+0+2,轉換後的數就是2002,沒錯就是它。通過模擬這一遍後面的就不用說了。

for (lens; lens > 0;){
	for (int i = lens - 1; i >= 1; i --){
		S[i - 1] += S[i] % B * A;
		S[i] /= B;
	}
	fina[len ++] = S[0] % B;
	S[0] /= B;
	while (lens > 0 && ! S[lens - 1])
		lens --;
}

三.Code

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

#define M 1005

int T, num[200];
char cha[200], t[M];

void translate (int A, int B, char *s){
	for (int i = 0; i < M; i ++)
		t[i] = 0;
	int lens = strlen (s);
	int S[M] = {}, fina[M] = {}, len = 0;
	for (int i = 0; i < lens; i ++){
		S[i] = num[s[lens - i - 1]];
	}
	for (lens; lens > 0;){
		for (int i = lens - 1; i >= 1; i --){
			S[i - 1] += S[i] % B * A;
			S[i] /= B;
		}
		fina[len ++] = S[0] % B;
		S[0] /= B;
		while (lens > 0 && ! S[lens - 1])
			lens --;
	}
	for (int i = 0; i < len; i ++)
		t[i] = cha[fina[len - i - 1]];
}
int main (){
	scanf ("%d", &T);
	for (int i = '0'; i <= '9'; i ++)
		num[i] = i - '0', cha[num[i]] = i;
	for (int i = 'a'; i <= 'z'; i ++)
		num[i] = 36 + i - 'a', cha[num[i]] = i;
	for (int i = 'A'; i <= 'Z'; i ++)
		num[i] = 10 + i - 'A', cha[num[i]] = i;
	while (T --){
		int A, B;
		char s[M];
		scanf ("%d %d%s", &A, &B, s);
		translate (A, B, s);
		printf ("%d %s\n%d %s\n\n", A, s, B, t);
	}
	return 0;
}

Thanks!

相關文章