C语言求cos值和sin值

学习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;
}

这类方法的优点:运行效率快,代码行数少。

缺点:需要理解,推荐一项一项列出来写在纸上,就可以发现规律

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值