把A进制数转化为B进制输出,一共有62种数字: 0 − 9 , A − Z , a − z 0-9,A-Z,a-z 0−9,A−Z,a−z
输入的第一行是一个整数 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.
每组数据输出三行. 第一行输出 A A A(以 10 10 10进制表示)和要转换的数(以 A A A进制表示),中间一个空格隔开。 第二行输出 B B B(以 10 10 10进制表示)和要转换的数(以 B B B进制表示),中间一个空格隔开。 第三行输出一个空行。 传送门
这道题目十分经典,可能在很多题目中出现。 有的人用高精度过了,我寻思这要用高精度吗?(其实是不会打) 做法: 首先预处理出’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 --; }