HDOJ1001
陷阱1: 输出两个空行
陷阱2: 使用求和公式
看两段代码:
第一段:利用循环
int n,sum;
while(scanf("%d", &n) !=EOF)
{
sum=0;
while(n) sum+=n--;
printf("%d\n\n",sum);
}
第二段:利用求和公式
int n,sum;
while(scanf("%d", &n) !=EOF)
{
printf("%d\n\n", n*(n+1)/2);
}
You may assume the result will be in the range of 32-bit signed integer. 这句话是个陷阱。
S(n)的值不会超过32位的有符号整数,即2^31-1=MAX。我们如果定义int型的变量 n 来表示输入的数字。
代码二中的bug:当数列的和等于MAX的时候,那么n*(n+1)为2*MAX,超过了32位能表示的范围。