中易网

C语言,为什么我的答案是0.000?怎么改正确

答案:4  悬赏:60  
解决时间 2021-01-18 09:06
  • 提问者网友:佞臣
  • 2021-01-17 15:24
C语言,为什么我的答案是0.000?怎么改正确
最佳答案
  • 二级知识专家网友:迷人又混蛋
  • 2021-01-17 16:38
一、错误
1、从代码输出的z以及z的赋值语句
z=x*j*e/w+z;来讲,x是什么,j是什么,e是什么,w又是什么。
很明显你的意图,j是正负,(!i%2)的时候j是-1,不改变j的值的话j一直会是-1。
w你可能想用来做(2i-1)!,可是w=w+w*y;是什么?
e是x^(2i-1),这倒是没有问题
于是,你把z=x*j*e/w+z;带一下,你看看这个表达式是啥。

2、int是整型,float是单精度浮点
浮点数放到整型里会被截去小数部分,那么变量e不应该为int,因为x是float,而e是x的(2i-1)次幂。
int类型的范围是 -2^31 ~ 2^31-1,15!超过了这个范围,因此不建议使用int型存储。


二、程序修改
#include 

int main()
{
    int i, n;
    int y, j, m;
    float w, e, z, x;
    scanf("%d%f", &n, &x);
    for (i=1, z=0; i<=n; i++)
    {
        if (i % 2 == 0)
            j = -1;
        else 
            j = 1;
        for (y = 1, w = 1; y <= 2*i-1; y++)
            w = w * y;
        for (m = 1, e = 1; m <= 2*i-1; m++)
            e = e * x;
        z = j * e / w + z;
    }
    printf("%.3f
", z);
    return 0;
}三、优化

1、合理利用项的递推关系
x^9/9!如何计算? 将x乘以9次,然后9*8*7...*1再计算9次?
你是否有想过x^9/9! = (x^7)/7! * x*x / 8/9
x^(2*i-1)/(2*i-1)! = [ x^(2*i-3)/(2*i-3)! ] * x*x /(2*i-2)/(2*i-1)
计算多项式后一项使用前一项的结果继续计算,而不需要“从头再来”
2、float的精度是6位十进制数,double的精度是15位十进制数,除非对所占内存和空间要求苛刻,否则,尽量使用double来缩小计算误差。
四、重写代码
#include 

int main()
{
    int i, j = 1, n;
    double ans, t, x;
    scanf("%d%lf", &n, &x);
    
    ans = t = x;
    for (i = 2; i <= n; i++)
    {
        j = -j;
        t = t * x * x / (2*i-2) / (2*i-1);
        ans += j * t;
    }
    printf("%.3f
", ans);
    return 0;
}--------------------
 最后,我忽略了一点,题目要求的是多组输入,因此可能需要这样处理一下:
#include 
 
int main()
{
    int i, n;
    int y, j, m;
    float w, e, z, x;
    while (scanf("%d%f", &n, &x)!=EOF)
    {
        for (i=1, z=0; i<=n; i++)
        {
            if (i % 2 == 0)
                j = -1;
            else 
                j = 1;
            for (y = 1, w = 1; y <= 2*i-1; y++)
                w = w * y;
            for (m = 1, e = 1; m <= 2*i-1; m++)
                e = e * x;
            z = j * e / w + z;
        }
        printf("%.3f
", z);
    }
    return 0;
}
追问:事实证明你的程序修改部分错误,不过优化部分很好你批评的很好,受教了
全部回答
  • 1楼网友:長槍戰八方
  • 2021-01-17 18:26
类型转换截断了,注意类型
  • 2楼网友:平生事
  • 2021-01-17 18:10
z定义成flaot型才对
  • 3楼网友:杯酒困英雄
  • 2021-01-17 17:03
你把代码复制/粘贴过来,才好调试啊。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息