下面是输入一个r1进制的n,将其转化为r2进制的算法:
令
n = n0 = n1*r2 + q0
n1 = n2*r2 + q1
.
.
.
nk = qk
其中 qi < r2.(qi 相当于每次除法的余数,其实这就是高中学过的进制转换的原理);
代码:
//其实就是把r1先转换成十进制再转换成r2进制;
void chg(char[], char ans[], int r1, int r2) {
int res = 0, len = strlen(s), i;
for(i = 0; i < len; i++) {
res *= r1;
res += (s[i] - '0');
}
i = 0;
while(res) {
ans[i++] = res%r2 + '0';
res /= r2;
}
len = strlen(ans); //这个strlen只能用一次;
for(i = 0; i < len/2; i++)
swap(ans[i], ans[len - 1 - i]);
}
下面是poj这题:
直接上代码,第一次看的人都觉得这代码很神:
#include <iostream>
#include <cstdio>
#include <cstring>
const int maxn = 888;
using namespace std;
int A[maxn], t[maxn];
char s[maxn], d[maxn];
int main() {
int T;
int a, b;
for(scanf("%d", &T);T--;) {
scanf("%d%d%s", &a, &b, s);
int k , i , l;
for(k = i = strlen(s); i-- > 0; )
t[k - 1 - i] = s[i] - (s[i] < 58 ? 48: s[i] < 97 ? 55 : 61);//这里要细心点
//下面是主程序,主要是避免换成十进制时,数超过int,实现过程中做了一些处理
for(l = 0; k; ) {
for(i = k; 1 < i--; ) { //这样的写法i第一次是等于k-1;
t[i-1] += t[i]%b*a;//这两句作用是,把能除尽的先除了算出来;
t[i] /= b; // 不能除尽的就往前累加;
}
A[l++] = t[0]%b;//这里的t[0]相当于上面程序的res;
t[0] /= b;
for(; 0 < k && !t[k - 1]; k--);//这里是t[k - 1],因为是从k-1开始的;
}
for(d[l] = i = 0; i < l; i++)//倒序赋值;ascii码为0的字符为NUL(null);
d[l - 1 - i] = A[i] + (A[i] < 10 ? 48: A[i] < 36 ? 55 : 61);
printf("%d %s\n%d %s\n\n", a, s, b, d);
}
return 0;
}