Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将两个大数字相加_C_Struct_Numbers_Addition - Fatal编程技术网

C 将两个大数字相加

C 将两个大数字相加,c,struct,numbers,addition,C,Struct,Numbers,Addition,我有两个大数字存储在一个数组中(p->numbers[50]和q->numbers[50]),并以十六进制打印出来 1319df046 111111111 当加在一起时,返回的是十六进制 242af'11'257 然而,显然我的答案是“应该” 242af0157 将f和1相加时存在差异,等于17,但打印11(因为16进制中17是11)。我不确定为什么我的输出应该是0而不是11 int sum = 0; int carry = 0; for(i = 9; i >= 0; i--) {

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

1319df046
111111111
当加在一起时,返回的是十六进制

242af'11'257

然而,显然我的答案是“应该”

242af0157

将f和1相加时存在差异,等于17,但打印11(因为16进制中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]);
}
(i=0;i<10;i++)的

{
总和=p[i]+q[i];
和=和+进位;
答案[i]=总和%16;
进位=总和/16;
}
对于(i=9;i>=0;i--){
printf(“%x”,答案[i]);
}

您的
数字
数组应该是base-16吗?如果是这样,那么携带
sum/10
就没有意义了
answer[i]
还应仅存储被基数除后的余数,
sum%16
sum%10
。数组中的数字存储为十进制,但在我回答[i]=sum%10时应打印为十六进制;相反,我的结果变成了242057257,以十六进制打印。你不能像那样逐位将十进制转换为十六进制。你必须转换整数。这个算法毫无意义。你在做算术,就好像它是十进制的,但打印数字就好像它是十六进制的。如果它是纯十进制的,那么
answer[i]=sum%10
,但是您认为将数字打印为十六进制会转换为十六进制,但它不会。正如Ryan所说,你不能像那样逐位进行十六进制转换。如果数字是十进制的,那么您必须将结果计算为一个完整的十进制数,然后返回并转换为十六进制。您正在将十进制数字(包括加法溢出)打印为十六进制,并在下一个和中包含进位。这将返回242af1257,而不是我应该得到的答案242af0157。但是,我理解我的错误,认为我存储的值是十进制的,而不是十六进制的。有了这些新发现的知识,我仍然不确定为什么您编写的新程序与预定义的答案不同。@Occazn dbush的代码对我来说很好,给出了
0242af0157
。也许你把它转录错了。哦,我猜出来了。谢谢大家的支持help@Occazn听起来您可能按错误的顺序添加了数字。确保从最不重要到最重要。@dbush明白了。谢谢你,你帮助我理解了这个问题,比我最初了解的要多得多。