本题考查大数问题。大数一般用字符串或者数组表示。注意,strlen()函数返回的值是数组\'\0\'前元素的个数,并不包括\'\0\'。
C++版本
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
void printNumber(char number[]){
bool isBeginning0 = true;
int nLength = strlen(number);
for(int i = 0; i < nLength; i++){
if(isBeginning0 && number[i] != \'0\')
isBeginning0 = false;
if(!isBeginning0)
printf("%c", number[i]);
}
printf("\t");
}
// 实现两个大数相加,结果记入到a[]; flag标记哪一个是负数; 返回值有两个,1表示溢出,2表示结果为正数,3表示结果为负数
int addBigInt(char a[], char b[], int flag){
int arraySize = strlen(a);
int ans = 2;
int nSum = 0;
// 第n个进位
int nTakeOver = 0;
for(int i = arraySize-1; i>=0; i--){
// 都是正数或者都是负数
if(flag == 0 || flag == 3)
nSum = (a[i]-\'0\') + (b[i]-\'0\') + nTakeOver;
// a是负数
else if(flag == 1){
nSum = -(a[i]-\'0\') + (b[i]-\'0\') + nTakeOver;
}
// b是负数
else if(flag == 2){
nSum = (a[i]-\'0\') - (b[i]-\'0\') + nTakeOver;
}
// 如果产生进位
if(nSum > 9){
// 如果是首位产生了进位,那么溢出
if(i == 0)
ans = 1;
else{
a[i] = \'0\' + nSum - 10;
nTakeOver = 1;
}
}
// 如果产生借位
else if(nSum < 0){
// 如果是首位产生了借位,那么是负数
if(i == 0)
ans = 3;
else{
a[i] = \'0\' + 10 + nSum;
nTakeOver = -1;
}
}
// 如果没有产生进位,也没有借位,这里不会break;
else{
a[i] = \'0\' + nSum;
nTakeOver = 0;
}
}
// 如果都是负数,则结果也是负数
if(flag == 3)
return 3;
return ans;
}
int main()
{
char a[8] = {\'1\',\'6\',\'3\',\'5\',\'3\',\'5\',\'4\',\'\0\'};
char b[8] = {\'0\',\'0\',\'4\',\'3\',\'2\',\'6\',\'3\',\'\0\'};
cout<<strlen(a)<<endl;
if(addBigInt(a, b, 3) == 3)
printNumber(a);
return 0;
}