【问题描述】
给定一个精度值e,用下列公式计算sin(x)的近似值,要求前后两次迭代之差的绝对值小于e,给出相应的最小迭代次数n和最后一次计算的sin(x)值。
sin x = x - x3/3! + x5/5! - x7/7! + ... + (-1)n-1x2n-1/(2n-1)!
其中x为弧度,n为正整数。
【输入形式】
从控制台输入x( (0<x<=10) )和e( x>e>0 )的值,以一个空格分隔。
【输出形式】
输出迭代次数n和最后一次计算的sin(x)的值(以一个空格分隔,并且输出sin(x)时要求小数点后保留9位有效数字)。
【样例输入】
1.23 0.0000001
【样例输出】
7 0.942488802
【样例说明】
输入的x为1.23,精度值e为0.0000001。当n为5时,利用上述公式计算sin(x)的值为0.942489044,n为6时计算的结果为0.942488800,两结果之差的绝对值约为0.000000244,大于要求的精度值0.0000001,故需要继续迭代计算。当n为7时计算的结果为0.942488802,与n为6的计算结果之差的绝对值约为0.000000002,小于要求的精度值,所以最小迭代次数应为7,最后一次计算的sin(x)的值为0.942488802(小数点后保留9位有效数字)。
注意:
(1) 为保证计算精度,请使用double数据类型保存计算数据。
(2) 应至少迭代两次,即:n>=2。
n=7时测试数据与我的结果数据差了一点点,思路和其他测试数据都一样,不知道为啥。
#include<stdio.h>
#include<math.h>
int f(int n)
{
int i,sum=1;
for(i=1;i<=n;i++)
{
sum*=i;
}
return sum;
}
int main()
{
double x,e,x2,x3,x4;
scanf("%lf %lf",&x,&e);
x2=x;
x3=1;
x4=x;
int i,j,flag=-1,cnt=1;
for(i=2;x3>=e;i++)
{
x3=x2;
x4*=x*x;
x2=x2+x4*flag/f((2*i-1));
flag=-flag;
x3=fabs(x2-x3);
cnt++;
}
printf("%d %.9lf",cnt,x2);
return 0;
}