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!
相關文章
- oracle進位制轉換to_number_to_char_bin_to_numOracle
- 【進位制轉換】十進位制與十六進位制相互轉換方法
- Qt進位制轉換(十進位制轉十六進位制)QT
- JavaScript 進位制轉換(2進位制、8進位制、10進位制、16進位制之間的轉換)JavaScript
- 進位制轉換
- 十六進位制轉換為八進位制
- 十六進位制轉換為十進位制
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- PAT B1022 D進位制的A+B(進位制轉換板題,簡單模擬)
- 二進位制轉十進位制快速轉換方法
- lua之m進位制轉換為n進位制-任意進位制轉換演算法演算法
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- JavaScript 進位制轉換JavaScript
- 1.5進位制轉換
- 進位制的轉換
- JavaScript之number型別的數值轉換成某某進位制JavaScript型別
- JavaScript十進位制轉換為二進位制JavaScript
- shell 中轉換16進位制10進位制
- Oracle二進位制與十進位制轉換Oracle
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- Python 進位制互相轉換(二進位制、十進位制和十六進位制)Python
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 十進位制與二進位制互相轉換指南
- 進位制均值-進位制轉換+最大公約數
- 【轉帖】Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式
- 數的進位制轉換
- python 進位制轉換Python
- c#進位制轉換C#
- 進位制轉換圖解圖解
- 【python】進位制轉換Python
- (轉)【iOS 開發】二進位制、十進位制、十六進位制相互轉換的方法iOS
- 2012 天津站B題||hdu4432 進位制轉換 模擬
- 大話二進位制,八進位制,十進位制,十六進位制之間的轉換
- 數字邏輯練習題-(二進位制/16進位制模擬)
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制