0

如何编写以数字为参数的程序并返回 1+2+.. 的总和直到参数?

我无法正确获取代码。有人可以帮助我吗?

#include<stdio.h>
#include<stdlib.h>                                                               
int main(int argc, char*argv[])
{
int i;
int sum =0;

if(argc !=2){
 printf("usage: %s <count> \n", argv[0]);
 exit(n);
 }

for(i=1; i<=atoi(argv[1]); i++){
 sum+=i;
}
4

3 回答 3

2

首先,回答你的问题。

您需要实际输出结果。就像是:

printf("%d\n", sum);

或者将其返回给调用该程序的任何人,尽管这有点不寻常:

int main( int argc, char **argv ) {
    ...
    return sum;
}

但是我在这里提供自己的答案,因为有充分的理由考虑循环执行此操作……至少在您考虑更多之前。

即,公式(n * (n+1)) / 2将溢出 32 位整数并在n变为 65536 或更大时产生错误答案。但是 32 位整数本身可以存储一个总和为n <= 92681. 这意味着公式本身会为大约 30% 的解空间产生错误的答案。

所以你可能认为你需要循环,但这里有一个小技巧。因为公式同时使用nn+1,所以您可以保证其中一个数字可以被 2 整除。因此您可以这样做:

unsigned long n;
unsigned long sum;

n = atoi(argv[1]);

if( n == 0 || n > 92681 ) {
    printf( "The supplied value (%u) is out of range\n", n );
} else {
    if( (n % 2) == 0 ) {
        sum = (n / 2) * (n+1);
    } else {
        sum = n * ((n+1) / 2);
    }
    printf( "Sum from 1 to %u is %u\n", n, sum );
}

现在你有一个简单的公式,它产生与循环相同的答案,至少对于n不会导致总和溢出的所有值。

于 2012-10-16T22:08:04.733 回答
0

无需使用循环。您可以使用简单的公式,

整数总和 = (n * (n + 1)) / 2

其中 n 将是您的输入。

输出将是从输入到 1 的每个数字的总和,减 1 - 与循环相同。

于 2012-10-16T21:30:15.920 回答
0
#include<stdio.h>
#include<stdlib.h>                                                               
int main(int argc, char*argv[])
{
    int i;
    int sum =0;

    if(argc !=2){
        printf("usage: %s <count> \n", argv[0]);
        exit(n);
    }
    int n = atoi(argv[1]);
    sum = (n*(n+1))/2; // formula of sum of first n numbers
}
于 2012-10-16T21:20:12.967 回答