まず、あなたの質問に答えます。
実際に結果を出力する必要があります。何かのようなもの:
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
、合計がオーバーフローすることはありません。