我正在编写一个程序,以添加两个大的非负整数(每个大整数最多包含100个数字)。但是,在我的程序中,大多数情况下输出错误。
我已经完成了main()
函数,但是我认为我的代码存在问题在AddTwoBigNumbers()
函数中。
#include <stdio.h>
const int MAX_INT_LENGTH = 100;
void AddTwoBigNumbers(char bigN[], char bigM[], char sum[]) {
int i = 0;
int index = 0;
int count = 0;
int index2 = 0;
while (1) {
int sum1 = count;
if (bigM[index]) {
sum1 += bigM[index] - '0';
index++;
}
if (bigN[index2]) {
sum1 += bigN[index2] - '0';
index2++;
}
sum[i] = sum1 % 10 + '0';
i++;
count = sum1 / 10;
if (bigM[index] == 0 && bigN[index2] == 0) {
break;
}
}
if (count) {
sum[i] = count + '0';
i++;
}
sum[i] = 0;
int x, len = 0;
for (x = 0; sum[x]; ++x) {
++len;
}
for (x = 0; x < len / 2; ++x) {
sum[len] = sum[x];
sum[x] = sum[len - x - 1];
sum[len - x - 1] = sum[len];
}
}
int main() {
char bignum[2][MAX_INT_LENGTH]; // bignum[0] and bignum[1] are to store the digits of the two input number
char sum[MAX_INT_LENGTH + 1]; // to store the sum of the two big numbers
// read in two numbers
scanf("%s", bignum[0]);
scanf("%s", bignum[1]);
// calculate sum of the two numbers
AddTwoBigNumbers(bignum[0], bignum[1], sum);
// display the sum on screen
printf("%s\n", sum);
return 0;
}
示例如下:
输入:
1
999999999999999999999999999
输出:
1000000000000000000000000000
我的输出:
1000000000000000000000000000
输入:
999999999999999999999999999
999999999999999999999999999
输出:
1999999999999999999999999998
我的输出:
1999999999999999999999999989
答案 0 :(得分:1)
您的函数从左到右将两个整数相加。尝试这种方法,它是一种从后到前添加的算法(数组参数通常会降级为指针,因此char *bigN
等于char bigN[]
):
void AddTwoBigNumbers(char *bigN, char *bigM, char* sum)
{
int add = 0;
int index = 0;
int count = 0;
int nbigN = strlen(bigN)-1;
int nbigM = strlen(bigM)-1;
while (nbigN >= 0 || nbigM >= 0)
{
int N = 0, M = 0;
if (nbigN >= 0)
{
N = bigN[nbigN] - '0';
nbigN--;
}
if (nbigM >= 0)
{
M = bigM[nbigM] - '0';
nbigM--;
}
add = N + M + count;
sum[index++] = add % 10 + '0';
count = add / 10;
}
if (count)
sum[index++] = count + '0';
sum[index] = 0;
int nsum = strlen(sum);
for (int i = 0, j = nsum - 1; i < j; i++, j--)
{
char c = sum[i];
sum[i] = sum[j];
sum[j] = c;
}
}
编辑:
int strlen(char* buf)
{
int len = 0;
if (buf == NULL)
return len;
while (*buf++)
len++;
return len;
}
答案 1 :(得分:1)
在发布的程序中,您首先考虑的是最高有效数字。
尝试先考虑最低有效数字,然后再逐步尝试最高有效数字。
考虑可能产生的进位值,并将它们添加到下一组值中,并相应地重置进位值。
请记住,数字被视为字符。需要整数值时,从字符中减去'0'
,然后通过添加'0'
将它们转换回字符形式。
针对bigM
和bigN
的长度也不相同的情况进行调整。
如果bigM
的所有数字都用完了,请使用bigN
的值并携带值(如果有)来计算sum
的所有剩余数字,反之亦然。
最后,在两个输入数字的所有数字都用完后,检查是否还有剩余进位,并将其也添加到sum
中。
您可以以相反的方式计算并向sum
插入值,并在以后根据需要将字符串反向。
别忘了用nul('\0'
)结尾处的sum
。
您可以做类似的事情
void AddTwoBigNumbers(char bigN[], char bigM[], char sum[])
{
int i=strlen(bigM)-1, j=strlen(bigN)-1, k, carry=0;
for(k=0; i>=0 && j>=0; --i, --j, ++k)
{
sum[k] = (bigM[i]-'0' + bigN[j]-'0' + carry)%10 + '0';
carry = (bigM[i]-'0' + bigN[j]-'0' + carry)/10;
}
for(; i>=0; --i, ++k)
{
sum[k] = (bigM[i]-'0' + carry)%10 + '0';
carry = (bigM[i]-'0' + carry)/10;
}
for(; j>=0; --j, ++k)
{
sum[k] = (bigN[j]-'0' + carry)%10 + '0';
carry = (bigN[j]-'0' + carry)/10;
}
if(carry!=0)
{
sum[k++]=carry+'0';
}
sum[k]=0;
//Reversing string
for(int t=0; t<n/2; ++t)
{
char temp=sum[t];
sum[t]=sum[n-1-t];
sum[n-1-t]=temp;
}
}