将两个大数相加
Adding two large numbers together
我有两个大数存储在一个数组中(p->numbers[50] 和 q->numbers[50]),并以十六进制打印出来
1319df046
111111111
加在一起后,我返回十六进制
242af'11'257
然而,显然我的答案"should"是
242af0157
f 和1 相加时出现差异,等于17,但打印出11(因为17 是十六进制的11)。我不确定为什么我的输出应该是 0 而不是 11
int sum = 0;
int carry = 0;
for(i = 9; i >= 0; i--)
{
sum = p->numbers[i] + q->numbers[i];
sum = sum + carry;
answer[i] = sum;
carry = sum / 10;
printf("%x", answer[i]);
}
我通过如下定义数字数组来重现您的结果:
int p[] = {0x6,0x4,0x0,0xf,0xd,0x9,0x1,0x3,0x1,0x0};
int q[] = {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x0};
这不是将数字存储为十进制,而是十六进制数字。
考虑到这一点,这里存在三个问题:
首先,您计算进位的方式不正确。因为数字是十六进制而不是十进制,进位应该是 sum / 16
而不是 sum / 10
.
其次,当涉及进位时,您不会删除总和的高位。在一个地方,你有 0xf + 0x1 + 0x1 = 0x11 并且两个字符都被打印了。您需要将数字设置为 answer[i] = sum % 16;
第三,您要将数字从大到小相加。您需要在一个循环中将它们从小到大相加,然后在单独的循环中从大到小打印数字。
完成这些修复后,您的代码应如下所示:
for(i = 0; i < 10; i++)
{
sum = p[i] + q[i];
sum = sum + carry;
answer[i] = sum % 16;
carry = sum / 16;
}
for(i=9; i>=0; i--) {
printf("%x", answer[i]);
}
我有两个大数存储在一个数组中(p->numbers[50] 和 q->numbers[50]),并以十六进制打印出来
1319df046
111111111
加在一起后,我返回十六进制
242af'11'257
然而,显然我的答案"should"是
242af0157
f 和1 相加时出现差异,等于17,但打印出11(因为17 是十六进制的11)。我不确定为什么我的输出应该是 0 而不是 11
int sum = 0;
int carry = 0;
for(i = 9; i >= 0; i--)
{
sum = p->numbers[i] + q->numbers[i];
sum = sum + carry;
answer[i] = sum;
carry = sum / 10;
printf("%x", answer[i]);
}
我通过如下定义数字数组来重现您的结果:
int p[] = {0x6,0x4,0x0,0xf,0xd,0x9,0x1,0x3,0x1,0x0};
int q[] = {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x0};
这不是将数字存储为十进制,而是十六进制数字。
考虑到这一点,这里存在三个问题:
首先,您计算进位的方式不正确。因为数字是十六进制而不是十进制,进位应该是 sum / 16
而不是 sum / 10
.
其次,当涉及进位时,您不会删除总和的高位。在一个地方,你有 0xf + 0x1 + 0x1 = 0x11 并且两个字符都被打印了。您需要将数字设置为 answer[i] = sum % 16;
第三,您要将数字从大到小相加。您需要在一个循环中将它们从小到大相加,然后在单独的循环中从大到小打印数字。
完成这些修复后,您的代码应如下所示:
for(i = 0; i < 10; i++)
{
sum = p[i] + q[i];
sum = sum + carry;
answer[i] = sum % 16;
carry = sum / 16;
}
for(i=9; i>=0; i--) {
printf("%x", answer[i]);
}