加法是最基础的一种运算了,在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,不仅可以处理大整数的各种运算,而且也能自定义整数的进制,这似乎变得十分方便了。