将两个大数字加在一起

anc*_*ea4 -1 c struct numbers addition

我有一个存储在数组中的两个大数字(p->数字[50]和q->数字[50]),并以十六进制打印出来

1319df046
111111111
Run Code Online (Sandbox Code Playgroud)

当加在一起时,我以十六进制的形式返回

242af'11'257

但是,显然我的答案"应该"

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]);
}
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 5

我通过定义数字数组来重现您的结果,如下所示:

int p[] = {0x6,0x4,0x0,0xf,0xd,0x9,0x1,0x3,0x1,0x0};
int q[] = {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x0};
Run Code Online (Sandbox Code Playgroud)

不是将数字存储为十进制数,而是存储为十六进制数字.

考虑到这一点,这里有三个问题:

首先,你计算进位的方式是不正确的.因为数字是十六进制而不是十进制,所以进位应该是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]);
}
Run Code Online (Sandbox Code Playgroud)