使用循环计算 1 到 n 之和时结果错误

dan*_*l12 0 c

我想使用循环计算 1 到 n 的总和,这是我的 C 代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    long sum = 0;
    int n = atoi(argv[1]);
    for(int i = 1; i<= n; i++)
        sum += i;
    printf("Sum of serial from 1 to %d = %ld\n", n, sum);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我用小 n 运行程序时,结果是正确的,但当我用大数字运行时,结果是错误的。这是我运行此命令时的结果:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    long sum = 0;
    int n = atoi(argv[1]);
    for(int i = 1; i<= n; i++)
        sum += i;
    printf("Sum of serial from 1 to %d = %ld\n", n, sum);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*CAT 5

它看起来long在您的环境中是 32 位长,它可以容纳的最大值是 2,147,483,647。1 到 100,000 的整数之和为 5,000,050,000,超出了限制。

在C99及更高版本中,可以使用long longtype,其最大值至少为9,223,372,036,854,775,807。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    long long sum = 0;
    int n = atoi(argv[1]);
    for(int i = 1; i<= n; i++)
        sum += i;
    printf("Sum of serial from 1 to %d = %lld\n", n, sum); // use %lld to print "long long" value
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

int64_ttype ininttypes.h可能会被更多编译器支持。

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

int main(int argc, char *argv[]){
    int64_t sum = 0;
    int n = atoi(argv[1]);
    for(int i = 1; i<= n; i++)
        sum += i;
    printf("Sum of serial from 1 to %d = %" PRId64 "\n", n, sum); // use PRId64 macro to print "int64_t" value
    return 0;
}
Run Code Online (Sandbox Code Playgroud)