NUMBER BASE CONVERSION(进制转换) 经典模拟

    科技2024-12-18  11

    文章目录

    一.题目InputOutput 二.Solution三.CodeThanks!

    一.题目

    把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!

    Processed: 0.065, SQL: 8