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、从代码输出的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
你把代码复制/粘贴过来,才好调试啊。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息