原题目
http://acm.hdu.edu.cn/showproblem.php?pid=1001
看似很简单的一个题目,求1至n的和且保证结果是在int范围内的。
但是按照如下代码提交却出现wa错误。
#include<iostream>
using namespace std;
int main()
{
unsigned int a;
while(cin>>a)
cout<<a*(a+1)/2<<"\n"<<endl;
return 0;}
经过思考,决定使用比较笨得方法,如下
#include<iostream>
using namespace std;
int main()
{
unsigned int a;
while(cin>>a)
{ int sum=0;
for(int i=1,i<=a,i++)
{
sun+=i;}
cout<<sum<<"\n\n";}
return 0;}
这个方法提交就是正确的。
我反复思考的两个方法的差别,突然发现 题目说明sum是符合要求的,但是a*(a+1)是sum的两倍,就有可能会遇到截断的危险,所以 问题到这里就解决了。
#include<iostream>
using namespace std;
int main()
{
unsigned int a;
while(cin>>a)
if(a%2==0)
cout<<a/2*(a+1)<<"\n"<<endl;
else
cout<<(a+1)/2*a<<"\n"<<endl;
return 0;}
由着引发的思考是题目要求的数据极限大小,应该在乘法之前先做除法。