世界著名的物理学家Albert正在计算的值。不幸的是,由于这项工作十分枯燥无味,这位伟大的物理学家得到了错误的答案。由于这一错误,它制造的几颗原子弹失去了控制,射向了五座重要的城市和一片热带雨林……
现在你的任务是帮助这位物理学家纠正这一错误,从而拯救世界。对于给定的n (n≤5*10^6),计算代数式的值。
输入数据由多组数据组成。每组数据一行,仅有一个整数,表示n的值。
对于每组数据,输出代数式的值(小数点后保留12位有效数字)。
2
1.500000000000
分析:对于double类型的数据,当两个数相差较大,或只有一个数很小(接近0)时,这两个数进行运算,会发生精度损失,为了避免这种情况,本题采用从小到大的顺序累加
AC代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
double ans=0.0;
for(int i=n;i>=1;i--)
ans+=(double)1/i;
printf("%.12lf\n",ans);
}
return 0;
}
下面这题也是类似的问题:
求sin(x)近似值
时间限制:1 Sec 内存限制:128 MB
提交:35 正确:11
提交:35 正确:11
[ 提交 ] [ 统计 ] [ 提问 ]
题目描述利用公式
计算sin(x)的值。要求最后一项的绝对值小于10-5,并统计出此时累计的多少项。 输入描述输入x值(-2π~2π)之间 输出描述
输出计算出的sin(x)的值和累计项数
输入样例6 输出样例-0.279415,12
分析:直接用pow(x,n)/jiecheng(n),是行不通的,当数据很大时会有精度损失,出现异常
AC代码如下: |