杭电acm1001,我错哪了?

#include<stdio.h>main(){intn,k=1;longa,sum;scanf("%d",&n);while(n--){scanf("%ld",&a);... #include<stdio.h>
main()
{
int n,k=1;
long a,sum;
scanf("%d",&n);
while(n--)
{
scanf("%ld",&a);
sum=a*(a+1)/2;
printf("%d",k);
k++;
printf("ld",sum);

}

}
展开
 我来答
endlman
2009-04-10 · 超过16用户采纳过TA的回答
知道答主
回答量:36
采纳率:0%
帮助的人:32.2万
展开全部
sum=a*(a+1)/2; //这里出了问题 注意,是出了问题,公式并没有错.
因为sum是int 32位的整型数据,当a足够大的时候,该表达式在计算 a*(a+1)
时,已经超出了 int 的范围,解决方案有两个:
一:

long sum;
改为:
long long sum;
//OK!我不知道C是怎样分的,反正在C++中 long 和 int 的字符长度是一样的.

二:
不用公式,用循环语句做.
以下是我提交的内容,仅供参考,谢谢:
我是C++爱好者,欢迎有空来我博客交流,分享.
http://hi.baidu.com/endlman

#include<iostream>

using namespace std;

int main()
{
int n;
while(cin>>n)
{
int a=0,i;
for(i=1;i<=n;i++)
a+=i;
cout<<a<<endl<<endl;

}
return 1;
}

/*
//此题一般情况可用公式求解,但上传到ACM上,为错误,.
若用公式求解,其中while部分改为:

while(cin>>n)
{
n=n*(n+1)/2;
cout<<n<<endl<<endl;
}

错误原因: 在公式中 会先计算 n+1 再乘以 n ,若n的初值足够大的时候,此时的 n 已经超出int的范围,
解决方案: 把n的类型定义为 long long n; (注:_int64 同等于 long long 但在正规的ACM竞赛中,可能会出错)

*/
鼻涕菜鸟
2009-04-10 · TA获得超过161个赞
知道小有建树答主
回答量:138
采纳率:0%
帮助的人:119万
展开全部
我做出来啦~~~
#include<stdio.h>
int main()
{
long n,m;

while(scanf("%d",&n)!=EOF)
{
if(n%2!=0)
m=(n+1)/2*n;
else m=n/2*(n+1);

printf("%ld\n\n",m);

}
return 0;
}考虑到n*(n+1)要数据溢出,判断奇偶性的,并且输入数据不定,不能
用n个代替,(*^__^*) 嘻嘻……,辛苦啊
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
下沙怪才
2009-04-10 · TA获得超过233个赞
知道小有建树答主
回答量:646
采纳率:0%
帮助的人:259万
展开全部
printf("ld",sum);

你没有换行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式