NUMBER BASE CONVERSION(進位制轉換) 經典模擬
一.題目
把A進位制數轉化為B進位制輸出,一共有62種數字:
0
−
9
,
A
−
Z
,
a
−
z
0-9,A-Z,a-z
0−9,A−Z,a−z
Input
輸入的第一行是一個整數
T
T
T表示資料組數.
每組資料一行,分別是輸入的進位制
A
A
A(以10進製表示),輸出的進位制
B
B
B(以10進製表示),要轉換的數(以
A
A
A進製表示).
保證
2
≤
A
,
B
≤
62
2≤A,B≤62
2≤A,B≤62.
在
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!
相關文章
- Qt進位制轉換(十進位制轉十六進位制)QT
- PAT B1022 D進位制的A+B(進位制轉換板題,簡單模擬)
- 進位制轉換
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- JavaScript 進位制轉換JavaScript
- 【python】進位制轉換Python
- 進位制的轉換
- JavaScript之number型別的數值轉換成某某進位制JavaScript型別
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- JavaScript十進位制轉換為二進位制JavaScript
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- 進位制與二進位制及相關轉換
- 進位制轉換圖解圖解
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 什麼是二進位制?二進位制如何轉換?
- [20190716]十進位制轉換其他進位制指令碼.txt指令碼
- 十進位制轉換任意進位制--鏈棧實現
- 計算機求解10進位制轉換任意進位制計算機
- JavaScript中的多種進位制與進位制轉換JavaScript
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- c++的進位制轉換C++
- 技術問 - 進位制轉換
- 進位制轉換的工具類
- JavaScript 進位制轉換 All In OneJavaScript
- Python中各進位制轉換Python
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- 口算 16 進位制轉換 10 進位制,但只適合兩位的 16 進位制
- Python 十進位制轉換為二進位制 高位補零Python
- oracle_16進位制與10進位制轉換小示例Oracle
- 僅做筆記用:base64字串轉換為十六進位制形式表示的二進位制資料筆記字串
- 計算機中進位制轉換計算機
- 資料轉換-16進位制字元字元
- 基礎問題:進位制轉換
- 遞迴函式實現十進位制正整數轉換為二進位制,八進位制,十六進位制遞迴函式
- n進位制轉十進位制