ACM-不同进制下的加法

加法是最基础的一种运算了,在ACM的题目中它也会以各种各样的形式出现,所以这里对其进行一些总结。这里主要讨论加法在不同进制下的实现过程,比如给出两个b进制下的数p和q,让计算出它们的和;假如继续增加条件,p和q的长度可以达到上百位(字符串),那么这种情况下,只有用最原始的方法进行模拟计算,即从个位开始,一位一位的相加求和进行计算。具体的实现方法的话,可以使用一个整型数组,将需要相加的各个数据的每一位累加到数组的对应位,最后再转化成对应进制即可,当然计算顺序需要从个位开始。下面的代码实现了这个过程,假设超过十进制后的数用'a'-'z'表示:

// 最大位数
#define MAX 205

int sum[MAX];
char data[MAX];
int n, b;

// n个b进制数相加
void add()
{
    int ma = 0;
    memset(sum, 0, sizeof(sum));
    while(n--)
    {
        scanf("%s", data);
        int len = strlen(data);
        // 反转,对齐个位
        reverse(data, data+len);
        for(int i=0; i<len; ++i)
        {
            if(isdigit(data[i]))
            {
                sum[i] += data[i]-'0';
            }
            else
            {
                sum[i] += data[i]-'a'+10;
            }
        }
        ma = max(ma, len);
    }
    // 取模,进位
    int carry=0;
    for(int i=0; i<ma; ++i)
    {
        sum[i] += carry;
        carry   = sum[i] / b;
        sum[i] %= b;
    }
    // 最高位有进位
    if(carry)
    {
        while(carry)
        {
            sum[ma] += carry;
            carry    = sum[ma] / b;
            sum[ma] %= b;
            ++ma;
        }
    }
    // 去掉前导零,但需要留一个
    while(ma>1 && sum[ma-1]==0)
    {
        --ma;
    }
    // 从最高位开始打印结果
    for(int i=ma-1; i>=0; --i)
    {
        if(sum[i] < 10)
        {
            printf("%d", sum[i]);
        }
        else
        {
            printf("%c", 'a'+(sum[i]-10));
        }
    }
    puts("");
}

值得一提的是,java中的高精度整数biginteger,不仅可以处理大整数的各种运算,而且也能自定义整数的进制,这似乎变得十分方便了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值