【C语言小白】使用函数求余弦函数的近似值 【题目的错误找不出来】

题目如图所示:

image.png
image.png
image.png

原题所在链接:
使用函数求余弦函数的近似值

我的代码如下:

double funcos( double e, double x ) {
    double delta;
    double numerator; //分子
    double denominator; //分母
    int k; //真实的k等于n+1
    
    double answer = 0;
    
    for (int n = 1;; n++) {
        numerator = pow(x, 2*n);
        
        int result = 1;  //计算2*n的阶乘
        for (int i = 0; i < 2*n; i++) {
            result = result*(i+1);
        }
        denominator = result;
        
        delta = numerator/denominator;
        
        if (delta < e && delta > -e) {
            k = n+1;
            break;
        }
        
    }

    for (int i = 0; i < k; i++) {
        
        if (i == 0) {
            delta = 1;
        } else {
            
            numerator = pow(x, 2*i);
            
            int result = 1;  //计算2*i的阶乘
            for (int j = 0; j < 2*i; j++) {
                result = result*(j+1);
            }
            denominator = result;
            
            if (i%2 != 0) {
                delta = (numerator/denominator)*(-1);
            } else {
                delta = numerator/denominator;
            }
        }
        answer += delta;
    }
    return answer;
    
}

报错如下:
image.png

不知道这里为什么说我错呢?有没有哪位大神可以帮忙解答一下?

后来找到正确答案如下,可以供参考:

#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 item = 1.0; //单个cosx项目
    double numerator = 1.0; //分子
    double denominator = 1.0; //分母
    double cosx = 1.0;  //整个cosx项目,由n个item组成
    
    int i; //cosx的项系数,从2开始,因为第一项等于1,已经一开始赋值了
    int flag = -1; //cosx的项系数的正负号
    
    for (i = 2; fabs(item) >= e; i+=2) {
        numerator *= x*x;  //分子等于x*x,每多一项就再乘一次
        denominator *= i*(i-1);  //分母为阶乘,每多一项就多2位的阶乘
        item = flag*numerator/denominator;
        cosx = cosx + item; //cosx等于所有的item相加
        flag *= -1; //第二项开始符号是负数,每次变号
    }
    return cosx;
}
阅读 2.8k
1 个回答

猜测是因为套了双重for循环来算分母的阶乘,精度要求高的情况下,到后面数据大就超时了(题目要求的400ms)。这算阶乘每次的过程是重复的,像标准答案那样把上一项的阶乘结果存下来去累乘就好。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进