准备考研了!但是发现自己的编程很不规范!
下面是杭州电子科技大学的一道acm
Problem Description
Hey, welcome to HDOJ(Hangzhou Dianzi University Online Judge).
In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n.
In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n.
Input
The input will consist of a series of integers n, one integer per line.
Output
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.
Sample Input
1 100
Sample Output
1 5050
总是习惯直接sum=n*(n+1)/2;
下面的解法是错误的;
#include<stdio.h>
int main()
{
long n;
while(scanf("%ld",&n)!=EOF)
printf("%ld\n\n", n*(n+1)/2);
return 0;
}
但是这样会发生溢出的情况;
切记是32位是有符号的
这是因为当我们取n=2^31-1;
这时候处理器的处理过程是直接从指令中取出n
先进行n+1计算产生溢出;变为负数
所以最终的结果是为负数;
时候;
所以这样是不行的;
下面我写了几个几种方法都是避免产生溢出的
#include<stdio.h>
int main()
{
long n;
while(scanf("%ld",&n)!=EOF)
printf("%ld\n\n", n%2? (n+1)/2*n: n/2*(n+1));
return 0;
}
上方法(是网上别人做的)中通过n%2其实浪费很多判断;
真正起作用的是n=2^31-1时候使n+1不产生溢出就可以了。
#include<stdio.h>
int main()
{
long n;
long long sum;
while(scanf("%ld",&n)!=EOF)
{ sum=(n+1);
sum*=n;
printf("%ld\n\n", sum/2);
}
return 0;
}
这是一个浪费空间的做法
但是也可以的;因为long long的长度是64
#include<stdio.h>
int main()
{ long i,n,sum;
while(scanf("%d",&n)!=EOF)
{sum=0;
for(i=1;i<=n;i++)
sum+=i;
printf("%d\n\n",sum); }
return 0;}
最好的办法是
#include<stdio.h>
int main()
{
unsigned int n;
while(scanf("%ld",&n)!=EOF)
printf("%ld\n\n", n*(n+1)/2);
return 0;
}
呵呵不讲了啊 !!!
大家不信去http://acm.hdu.edu.cn/showproblem.php?pid=1001试试就知道了 啊
我的编程规范不过!细节注意不够啊!!!
加油啊 !!!!
为了我的目标加油啊 !!!!