题目链接:PAT.1074宇宙无敌加速器
求解过程:
这里可以用4个数组来存储数据,一个保存N,一个保存添0后与N等长的输入1,一个保存添0后与N等长的输入2,另外一个保存结果。这里之所以要添0是为了方便计算。
易错分析:
1. 两个20位的数相加可能会超过20位,变成21位。而题目前20位的进制是我们决定的,其他题目中说默认为10进制,因此数组N第一个要先保存'0',方便解决溢出的问题。
2. 两个非负数相加可能是0+0=0,因此还要处理结果为0的情况。
程序:
#include <iostream>
#include <string.h>
#include <math.h>
#include <stdio.h>
using namespace std;
int main(int argc, char const *argv[])
{
char N[22], A[21], B[21], temp1[21], temp2[21];
int res[21];
/* 题目中说只需记住前20位,另外的默认为10进制。而
两个20位的数字相加,最多变成21位,所以补一个0就好 */
N[0] = '0';
scanf("%s", N+1);
cin >> A >> B;
int len = strlen(N);
int lenA = strlen(A);
int lenB = strlen(B);
int idxA = 0, idxB = 0; // A B的起始下标
for (int i = 0; i < len; i++)
{
res[i] = 0; // 保存结果
if (i < len - lenA) // 低位补0方便计算
temp1[i] = '0';
else
temp1[i] = A[idxA++];
if (i < len - lenB)
temp2[i] = '0';
else
temp2[i] = B[idxB++];
}
int c = 0, sys, sum; // 分别表示溢出和进制和该位求和;
for (int i = len - 1; i >= 0; i--)
{
if (N[i] == '0') // 如果是0则为10进制
sys = 10;
else
sys = N[i] - '0';
sum = temp1[i]-'0' + temp2[i]-'0' + c;
if (sum < sys){
res[i] = sum;
c = 0; // 如果不进位,需要把溢出设为0
}
else
{
c = sum / sys;
res[i] = sum % sys;
}
}
int j;
for (j = 0; j < len; j++)
if (res[j] != 0)
break;
if (j == len) // 如果结果是0
cout << 0;
else
for (; j < len; j++) // 否则输出;
cout << res[j];
return 0;
}