首页 > ACM题库 > HDU-杭电 > HDU 1001 Sum Problem[解题报告] C++
2013
11-25

HDU 1001 Sum Problem[解题报告] C++

Sum Problem

问题描述 :

Hey, welcome to HDOJ(Hangzhou Dianzi University Online Judge).

In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + … + n.

输入:

The input will consist of a series of integers n, one integer per line.

输出:

For each case, output SUM(n) in one line, followed by a blank line. You may assume the result will be in the range of 32-bit signed integer.

样例输入:

1
100

样例输出:

1

5050

 http://acm.hdu.edu.cn/showproblem.php?pid=1001

  题目看起来是挺简单的,第一反应就是用公式做,哪晓得用公式中间也要注意使用的方法。

不能直接sum=(1+n)*n/2;因为题目只是说结果在32bit之内,但(1+n)*n很可能超出32bit,所以这样写放上去就是错的。

这可能是和编译有关吧!决定今天晚上复习下编译原理这部分的内容。

  还有一个问题,题目也没有说要输入到文件末尾,但不加EOF判断,放上去又是错的,看来以后只要题目没有给出题目结束的标志时我都默认它要求输入到文件末尾好了。以防万一啊~~

 

#include<stdio.h>

int main()
{
	int n;
	int sum;   

	while(scanf("%d",&n)!=EOF)  //eof notice
	{
		//一定要这么算
		if(n%2==0)
			sum=n/2*(1+n);
		else
			sum = (1+n)/2*n;
		printf("%d/n/n",sum); 
	}
	return 0;
}

  1. 给你一组数据吧:29 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1000。此时的数据量还是很小的,耗时却不短。这种方法确实可以,当然或许还有其他的优化方案,但是优化只能针对某些数据,不太可能在所有情况下都能在可接受的时间内求解出答案。

  2. 这道题目虽然简单,但是小编做的很到位,应该会给很多人启发吧!对于面试当中不给开辟额外空间的问题不是绝对的,实际上至少是允许少数变量存在的。之前遇到相似的问题也是恍然大悟,今天看到小编这篇文章相见恨晚。

  3. 漂亮。佩服。
    P.S. unsigned 应该去掉。换行符是n 不是/n
    还可以稍微优化一下,
    int main() {
    int m,n,ai,aj,bi,bj,ak,bk;
    while (scanf("%d%d",&m,&n)!=EOF) {
    ai = sqrt(m-1);
    bi = sqrt(n-1);
    aj = (m-ai*ai-1)>>1;
    bj = (n-bi*bi-1)>>1;
    ak = ((ai+1)*(ai+1)-m)>>1;
    bk = ((bi+1)*(bi+1)-n)>>1;
    printf("%dn",abs(ai-bi)+abs(aj-bj)+abs(ak-bk));
    }
    }