读书人

杭电ACM1001比较后不明白求解释多

发布时间: 2012-11-14 10:12:19 作者: rapoo

杭电ACM1001比较后不明白,求解释,谢谢!
/*#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;
}
//这种本该超时的居然通过了

[解决办法]
浮点数强制转成整数,有可能会少1

不明白你为啥要把1.0和2.0写成浮点数,n*(n+1)必定是偶数这不需要证明吧?
[解决办法]
n*(n+1.0)/2.0这样先将整数n转换成浮点数,然后又强制转换为int,会导致某些数据位丢失。。。
[解决办法]
强制类型转换是有数字损失的
[解决办法]
不需要1.0,2.0,直接1,2就行,也不需要加(int)。n*(n+1)肯定是偶数,只要n不是0,除以2可以除尽
[解决办法]
第一、你第一种方法虽然不推荐,但是提交是能通过的
第二、n*(n+1)/2通不过是因为先算n*(n+1)是溢出了

C/C++ code
#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);    }} 

读书人网 >C++

热点推荐