已知sinx的近似计算公式如下:
sin x = x - x3/3! + x5/5! - x7/7! + ... + (-1)n-1x2n-1/(2n-1)!
其中x为弧度,n为正整数。编写程序根据用户输入的x和n的值,利用上述近似计算公式计算sinx的近似值,要求输出结果小数点后保留7位。
【输入形式】
从控制台输入小数x(0<=x<=20)和整数n(1<=n<=5000),两数中间用空格分隔。
【输出形式】
控制台输出公式结果:小数点后保留7位。
【样例输入1】
0.5236 4
【样例输出1】
0.5000011
【样例输入2】
0.5236 50
【样例输出2】
0.5000011
【样例说明】
输入x为0.5236,n为4,求得sinx近似计算公式的值为0.5000011,小数点后保留7位;同样,输入x为0.5236,n为50,求得sinx近似计算公式的值为0.5000011,小数点后保留7位。
注意:为保证数据的准确性和一致性,请使用double数据类型保存计算结果。
以下是本人的代码
#include<stdio.h>
#include<math.h>
int main()
{
double sin=0, x, t = 1;
int i,j,n,fu=-1;
scanf("%lf%d", &x,&n);
for (i = 1; i <2*n; i++)//x的幂从1到2n-1
{
if (i % 2 != 0)//只有奇次项才参与计算
{
t = 1;
for (j = 1; j <= i; j++)
{
t *= j;
}
fu *= -1;//奇次幂项每隔一项正负号变一次
sin += fu * pow(x,i) / t;
}
}
printf("%.7f", sin);
return 0;
}
递归法
这个是朋友写的,我不是很理解,求大佬讲解
#include <stdio.h>
#include <math.h>
int main ()
{
int n,i;
double x,s,t;
double fact(int a);//计算分母
scanf("%lf %d",&x,&n);
t=x;
if (x>=0&&x<=20&&n>=1&&n<=5000)
{
for (i=2;i<=n;i++)
{
s=pow(-1,i+1)*pow(x,2*i-1)/fact(2*i-1);
t=t+s;
}
printf("%.7f",t);
return 0;
}
}
double fact(int a)
{
if (a==1)
return 1;
else
return a*fact(a-1);
}