高精度进制转换 poj 1220 NUMBER BASE CONVERSION

下面是输入一个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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值