学习C语言的途中,我们一定会遇到关于求sin(x)值和求cos(x)值的问题。想当初缺乏解题经验,学识短浅,求这类问题闹了不少笑话,今天用递归的思想总结一下这类问题,避免其他人踩坑。初学者第一次发博客,如果哪里写的不好希望各位大佬见谅。
例如这道题目,让我印象深刻
这道题我最初自以为是自定义阶乘函数,再调用pow函数,十几层可以解决的代码硬是给我整了几十行,关键最后还运行超时,太悲伤了。
以下是错误示范:
#include<stdio.h>
#include<math.h> //调用数学库,用于使用pow函数和fabs()函数,用于求绝对值
int main()
{
float x;
float s=0.0;
//int flat=1;
int a=1;
scanf("%f",&x);
for(int i=1; ;i=i+2)
{
float ai;
ai=(pow(x,i)/(float)jiec(i);
s=s+a*ai;
a=-a;
if(fabs(ai)<=0.00001) //用于退出循环
break;
}
printf("%.3f",s); // 打印结果
return 0;
}
int jiec(int j) //自定义阶乘函数
{
int sum=1;
for(int i=1;i<=j;i++)
sum=sum*i;
return sum;
}
此处超时的原因可能是因为函数不断循环,不断调用pow函数从而造成超时。因此我就想能不能避免使用pow函数,解决这个问题,迭代的念头油然而生。
修改后的代码:
#include<stdio.h>
#include<math.h> //fabs()函数的使用
int main() //求sin值
{
int i,f=1;
float ai,x,s=0;
scanf("%f",&x);
ai=x;
for(int i=1; ;i=i+1){
s+=ai; //s=s+ai
ai=-ai*x*x/((2*i)*(2*i+1)); //ai不断正负变化,并且分子每次循环一次后都x的指数都会多2,分母为(2*i-1)!
if(fabs(ai)<0.00001) //用于循环退出,如果某一项的ai值小于规定值,则循环结束。
break;
}
printf("%.3f",s); //打印出sin值
return 0;
}
求cos值同理就不多说什么了,代码如下(这边用了函数):
#include <stdio.h>
#include <math.h>
double funcos( double e, double x );//声明函数
int main()
{
double e, x;
scanf("%lf %lf", &e, &x);
printf("cos(%.2f) = %.6f\n", x, funcos(e, x));
return 0;
}
double funcos(double e, double x)//函数体
{
double ai = 1;
double sum = 0;
int fact = 1;
for (int i = 1; ;i++)
{
sum = sum + ai;
ai = -ai * x * x / ((2*i) * (i*2 - 1)); //注意这边的括号要括起来,不然ai会越变越大,死循环
if (fabs(ai) < e)
break;
}
sum=sum+ai; //看题目需求,有时候要加最后一项的ai值
return sum;
}
这类方法的优点:运行效率快,代码行数少。
缺点:需要理解,推荐一项一项列出来写在纸上,就可以发现规律
标签:cos,函数,ai,double,sum,C语言,int,include,sin From: https://blog.csdn.net/successwyj/article/details/144608811