HDOJ(1001) Sum Problem

HDOJ(1001) Sum Problem

这一套题做错了几次,按理说直接用等差数列求和公式就行了,主要是要考虑一些运算符的结核性问题:

四则运算符(+、-、*、/)和求余运算符(%)结合性都是从左到右。

于是,我自己写了一个版本,主要是考虑(n+1)*n始终为偶数,这样就不用担心除以2时的取整问题:

 1 #include <stdio.h>
 2 
 3 int main(void)
 4 {
 5     int n;
 6     __int64 sum = 0;
 7 
 8     while (scanf("%d", &n) != EOF)
 9     {
10         sum = ((n + 1) * n) / 2;
11         printf("%I64d
", sum);
12         printf("
");
13     }
14 
15     return 0;
16 }

但是,这个版本并不能通过,还有一种可能就是(n+1)*n导致数据溢出了,于是搜索了一下,发现有人给出了一个通过了的代码,如下:

 1 #include <stdio.h>
 2 
 3 int main(void)
 4 {
 5     int n;
 6     __int64 sum = 0;
 7 
 8     while (scanf("%d", &n) != EOF)
 9     {
10         sum = (n % 2) == 0 ? ((1 + n) * (n / 2)) : ((1 + n) * (n / 2) + n / 2 + 1);
11         printf("%I64d
", sum);
12         printf("
");
13     }
14 
15     return 0;
16 }

 如果n为奇数,则使用(1+n)*(n/2)就会漏掉序列最中间的项,所以要最后再加上中间项n/2+1。

为了验证是防止溢出问题,我于是写了另外一个版本,结果通过了,代码如下:

 1 #include <stdio.h>
 2 
 3 int main(void)
 4 {
 5     int i, n;
 6     int sum = 0;
 7 
 8     while (scanf("%d", &n) != EOF)
 9     {
10         sum = 0, i = 1;
11 
12         while (i <= n){
13             sum += i;
14             ++i;
15         }
16         printf("%I64d
", sum);
17         printf("
");
18     }
19 
20     return 0;
21 }