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;
}

しかし、これをループで行うことを検討する十分な理由があるため、ここで私自身の答えを提供しています...少なくとももう少し考えてみるまでは。

つまり、 65536以上になると、数式(n * (n+1)) / 2は32ビット整数をオーバーフローし、間違った答えを生成します。nただし、32ビット整数自体は最大で合計を格納できますn <= 92681。つまり、数式自体は、解空間の約30%に対して間違った答えを生成します。

したがって、ループする必要があると思うかもしれませんが、ここにはちょっとしたトリックがあります。数式はとの両方nを使用するため、n+1これらの数値の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
#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 に答える
0

ループを使用する必要はありません。簡単な式を使用できます、

int sum =(n *(n + 1))/ 2

ここで、nは入力になります。

出力は、入力から1までの各桁の合計で、ループと同じように1ずつ減少します。

于 2012-10-16T21:30:15.920 に答える