首先,回答你的问题。
您需要实际输出结果。就像是:
printf("%d\n", sum);
或者将其返回给调用该程序的任何人,尽管这有点不寻常:
int main( int argc, char **argv ) {
...
return sum;
}
但是我在这里提供自己的答案,因为有充分的理由考虑循环执行此操作……至少在您考虑更多之前。
即,公式(n * (n+1)) / 2
将溢出 32 位整数并在n
变为 65536 或更大时产生错误答案。但是 32 位整数本身可以存储一个总和为n <= 92681
. 这意味着公式本身会为大约 30% 的解空间产生错误的答案。
所以你可能认为你需要循环,但这里有一个小技巧。因为公式同时使用n
和n+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
不会导致总和溢出的所有值。