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\n", sum); 12 printf("\n"); 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\n", sum); 12 printf("\n"); 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\n", sum); 17 printf("\n"); 18 } 19 20 return 0; 21 }