#include
#include
#include
const int MAXSIZE = 122;
// 完成以字符串形式的两个大数相加。返回字符串形式的和。
// tatol ← addnum1 + addnum2
char *LargeNumberAdd(char const *addnum1,char const *addnum2, char *total) {
int i,j,k = 0,len,result,carry = 0;
int len1 = strlen(addnum1);
int len2 = strlen(addnum2);
for(i = len1 - 1,j = len2 - 1; i >= 0 && j >= 0; --i,--j) {
result = addnum1[i] - '0' + addnum2[j] - '0' + carry;
carry = result/10;
total[k++] = result%10 + '0';
}
while(i >= 0) {
result = addnum1[i--] - '0' + carry;
carry = result/10;
total[k++] = result%10 + '0';
}
while(j >= 0) {
result = addnum2[j--] - '0' + carry;
carry = result/10;
total[k++] = result%10 + '0';
}
if(carry) total[k++] = carry + '0';
total[k] = '\0';
len = strlen(total);
for(i = 0; i < len/2; ++i) {
k = total[i];
total[i] = total[len - 1 - i];
total[len - 1 - i] = k;
}
return total;
}
// 完成以字符串形式的两个大数相减。返回字符串形式的差。
// difference ← subnum1 - subnum2
char *LargeNumberSub(char *subnum1,char *subnum2, char *difference) {
int i,j,k,result,borrow = 0;
int sign = 0,swap = 0;
char *pta,*ptb;
int len1 = strlen(subnum1);
int len2 = strlen(subnum2);
if(len1 == len2) {
for(i = 0; i < len1; ++i) {
if(subnum1[i] < subnum2[i]) {
swap = 1;
break;
}
}
}
if(len2 > len1 || swap == 1) {
pta = (char *)malloc((len2 + 1)*sizeof(char));
ptb = (char *)malloc((len1 + 1)*sizeof(char));
strcpy(pta,subnum2);
strcpy(ptb,subnum1);
k = len1;
len1 = len2;
len2 = k;
sign = 1;
}
else {
pta = (char *)malloc((len1 + 1)*sizeof(char));
ptb = (char *)malloc((len2 + 1)*sizeof(char));
strcpy(pta,subnum1);
strcpy(ptb,subnum2);
}
for(i = len2 - 1,j = len1 - 1,k = 0; i >= 0; --i,--j) {
result = pta[j] - ptb[i] - borrow;
if(result < 0) {
result += 10;
borrow = 1;
}
else borrow = 0;
difference[k++] = result + '0';
}
while(j >= 0) {
result = pta[j--] - '0' - borrow;
if(result < 0) {
result += 10;
borrow = 1;
}
else borrow = 0;
difference[k++] = result + '0';
}
if(sign) difference[k++] = '-';
difference[k] = '\0';
for(i = 0; i < k/2; ++i) {
result = difference[i];
difference[i] = difference[k - 1 - i];
difference[k - 1 - i] = result;
}
free(pta);
free(ptb);
return difference;
}
int main() {
char s[MAXSIZE] = "123";
char t[MAXSIZE] = "456";
char result[MAXSIZE + 1];
printf("%s + %s = %s\n",s,t,LargeNumberAdd(s,t,result));
printf("%s - %s = %s\n",s,t,LargeNumberSub(s,t,result));
return 0;
}