杭电ACM1001比较后不明白,求解释,谢谢!

c201113021044 2012-10-24 03:00:58
/*#include<iostream>
#include<fstream>
using namespace std;
int main(){
//ifstream cin("input.txt");
int n;
while((cin>>n)!=NULL){
cout<<(int)(n*(n+1.0)/2.0)<<endl<<endl;
}

return 0;
}*/
//上面没通过
#include <stdio.h>
int main(){
int n, sum;
while (scanf("%d", &n) == 1){
sum = 0;
while (n != 0){
sum += n--;
}
printf("%d\n\n", sum);
}
return 0;
}
//这种本该超时的居然通过了
...全文
285 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
c201113021044 2012-10-27
  • 打赏
  • 举报
回复
非常感谢六楼的,第一种方法的确能通过,不知道当时怎么搞的。在这里也谢谢各位的参与
dpdp_2012 2012-10-26
  • 打赏
  • 举报
回复
第一、你第一种方法虽然不推荐,但是提交是能通过的
第二、n*(n+1)/2通不过是因为先算n*(n+1)是溢出了

#include <stdio.h>

int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n%2==0)
printf("%d\n\n",n/2*(n+1));
else
printf("%d\n\n",(n+1)/2*n);
}
}


也可以这样

#include <stdio.h>

int main()
{
int n;
while(scanf("%d",&n)!=EOF)
printf("%d\n\n",(long long)n*(n+1)/2);
}
c201113021044 2012-10-26
  • 打赏
  • 举报
回复
大家说的最多的是强制类型转换的问题,我试过了,(n*(n+1)/2)这样也没有通过。加上1.0,2.0这样在部分范围内可以防止溢出。会不会是编译器的问题呢?
AndyZhang 2012-10-24
  • 打赏
  • 举报
回复
不需要1.0,2.0,直接1,2就行,也不需要加(int)。n*(n+1)肯定是偶数,只要n不是0,除以2可以除尽
十八道胡同 2012-10-24
  • 打赏
  • 举报
回复
强制类型转换是有数字损失的
碎碎念 2012-10-24
  • 打赏
  • 举报
回复
n*(n+1.0)/2.0这样先将整数n转换成浮点数,然后又强制转换为int,会导致某些数据位丢失。。。
baichi4141 2012-10-24
  • 打赏
  • 举报
回复
浮点数强制转成整数,有可能会少1

不明白你为啥要把1.0和2.0写成浮点数,n*(n+1)必定是偶数这不需要证明吧?

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧