gpt4 book ai didi

c - 一种更好的大数相加方法,Project Euler #13

转载 作者:行者123 更新时间:2023-11-30 20:30:11 26 4
gpt4 key购买 nike

Project euler problem 13

对于 C 程序,我用实际方法尝试了这个问题,即不在代码中定义数据,而是使用 scanf 来获取输入。

但是我不明白为什么输出是错误的!我得到 1373762303,而它应该是 5537376230。2-3 个数字似乎没问题。

#include <stdio.h>
#include <ctype.h>
#include <strings.h>
#define NUM 50
#define STRINGS 100
#define OUTPUT 10
int main(void) {
char str[STRINGS][NUM+1];
int answer[NUM+1] = {0};
int carry = 0, out_digits = OUTPUT;

for(int i = 0; i < STRINGS; i++){
scanf("%s", str[i]);
for(int j = NUM; j >=0; j--){
answer[j] += (str[i][j] - 48) + carry;
if(answer[j] > 9){
carry = answer[j] / 10;
answer[j] %= 10;
}else{
carry = 0;
}
}
}
printf("--------------------------------------------------\r\n");
printf("%d",carry);
for(int j = 0; j < OUTPUT-1; j++){
printf("%d",answer[j]);
}
printf("\r\n--------------------------------------------------");
return 0;
}

最佳答案

scanf使用根据输入(包括空终止符字节)构造的字符串填充您提供的数组。您正确分配了 51 个字节,但是当您开始添加数字时,您从索引 50 开始,这是 nul 字节的索引。实际数字是从索引 0 到 49。

这意味着您将在某个时刻将答案的个位数进位,因为该数字的答案计算如下

answer[50] += (str[i][50] - 48) + carry;
// ^^^^ correction applied for ASCII

另一个问题是您忘记在添加每个新数字开始时将进位重置为零。

这可能有效(未经测试),但它仍然不能真正处理最高位数字的溢出

for(int i = 0; i < STRINGS; i++){
scanf("%s", str[i]);
carry = 0; // Reset the carry
for(int j = NUM - 1; j >=0; j--){
answer[j] += (str[i][j] - 48) + carry;
if(answer[j] > 9){
carry = answer[j] / 10;
answer[j] %= 10;
}else{
carry = 0;
}
}
}

关于c - 一种更好的大数相加方法,Project Euler #13,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54922444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com