ACM-不同进制下的加法

来源:互联网 发布:java tomcat作用 编辑:程序博客网 时间:2024/05/17 08:57

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

// 最大位数#define MAX 205int 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,不仅可以处理大整数的各种运算,而且也能自定义整数的进制,这似乎变得十分方便了。


0 0
原创粉丝点击