用泰勒公式计算sinx并统计项数

3.11计算sinx的值

题目描述:
利用泰勒级数 sinx=x-x^3/3!+x^5/5!-x^7/7!+…… 计算sinx的值。要求最后一项的绝对值小于1e-5,并统计出此时累加的项数。

输入描述:
一个实数x(一个角度的弧度数)

输出描述:
sinx的值和累加的项数。

样式输入:
1.57

样式输出:
sinx=1.000000,n=6

#include<stdio.h>
#include<math.h>
double f(double x,double i)
{
return pow(x,i);
}
int main()
{
int n=0,i=1,k=1,j=1;
double sinx=0,t,x;
scanf("%lf",&x);
do
{
for(j=1;j<=i;j++)
{
k=k*j;
}
t=f(-1,n)*f(x,i)/k;
sinx=sinx+t;
i=i+2;
n++;
}while(fabs(t)>=(1e-5));
printf("sinx=%6lf,n=%d",sinx,n);
return 0;
}

能帮忙改一下代码吗 运行结果跟样式输出不一样

你这样获取K值得效率太低了,这样写 k=k*(i)*(i-1);

do
{
if(i!=1){
k=k*(i)*(i-1);
}

t=f(-1,n)*f(x,i)/k;
sinx=sinx+t;
i=i+2;
n++;
}while(fabs(t)>=(1e-5));

代码这样写,你每次循环的时候,你的k值在无限增大,你应该在每次while循环进入时,将k=1,重置为1,否则k是上次的阶乘再乘当前 的阶乘,导致k取值错误

do
{
k=1;
for(j=1;j<=i;j++)
{
k=k*j;
}
t=f(-1,n)*f(x,i)/k;
sinx=sinx+t;
i=i+2;
n++;
}while(fabs(t)>=(1e-5));