鱼C论坛

 找回密码
 立即注册
查看: 1582|回复: 21

[已解决]求助,while语句

[复制链接]
发表于 2023-5-30 17:17:11 | 显示全部楼层 |阅读模式
3鱼币
求下列算式的值,直到最后一项绝对值小于1e-5(该项不累加),要求用while语句编程。
sum=1-1/2!+1/3!-1/4!+....+(-1)^(n-1)*1/n!+...
最佳答案
2023-5-30 17:17:12
以下是用 C 语言编写的程序,来求解上述算式的值,并确保当最后一项绝对值小于 1e-5 时停止累加:
#include <stdio.h>
#include <math.h>

int main() {
    int n = 1;
    double sum = 1.0, term = -1.0 / 2.0;

    while (fabs(term) >= 1e-5) {
        sum += term;
        n++;
        term = pow(-1, n - 1) * 1.0 / (double)n / term;
    }

    printf("sum=%.5f\n", sum);

    return 0;
}

在此代码中,我们初始化变量 `n=1` 和 `sum=1.0`,分别代表着当前处理到的项数和截至目前的求和结果。然后我们定义 `term` 表示要累加的当前这一项,初始值设为 `-1.0 / 2.0`。具体而言,我们将循环执行以下步骤:

1. 求出下一项,即 `term`,并根据其绝对值是否小于等于 1e-5 决定是否跳出循环。
2. 将 `term` 累加到 `sum` 中。
3. 更新 `n` 的值,进而求出下一项。

因为给出的公式里有个反复计算指数阶乘的部分可会导致结果溢出,并且相邻项之间的比值偏差较大,因而当指数阶乘次数比较大时,会发生精度归零问题,需要用逆元素法方式把每一项下一项计算出来。

给个最佳答案支持一下

最佳答案

查看完整内容

以下是用 C 语言编写的程序,来求解上述算式的值,并确保当最后一项绝对值小于 1e-5 时停止累加: 在此代码中,我们初始化变量 `n=1` 和 `sum=1.0`,分别代表着当前处理到的项数和截至目前的求和结果。然后我们定义 `term` 表示要累加的当前这一项,初始值设为 `-1.0 / 2.0`。具体而言,我们将循环执行以下步骤: 1. 求出下一项,即 `term`,并根据其绝对值是否小于等于 1e-5 决定是否跳出循环。 2. 将 `term` 累加到 ` ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 17:17:12 | 显示全部楼层    本楼为最佳答案   
以下是用 C 语言编写的程序,来求解上述算式的值,并确保当最后一项绝对值小于 1e-5 时停止累加:
#include <stdio.h>
#include <math.h>

int main() {
    int n = 1;
    double sum = 1.0, term = -1.0 / 2.0;

    while (fabs(term) >= 1e-5) {
        sum += term;
        n++;
        term = pow(-1, n - 1) * 1.0 / (double)n / term;
    }

    printf("sum=%.5f\n", sum);

    return 0;
}

在此代码中,我们初始化变量 `n=1` 和 `sum=1.0`,分别代表着当前处理到的项数和截至目前的求和结果。然后我们定义 `term` 表示要累加的当前这一项,初始值设为 `-1.0 / 2.0`。具体而言,我们将循环执行以下步骤:

1. 求出下一项,即 `term`,并根据其绝对值是否小于等于 1e-5 决定是否跳出循环。
2. 将 `term` 累加到 `sum` 中。
3. 更新 `n` 的值,进而求出下一项。

因为给出的公式里有个反复计算指数阶乘的部分可会导致结果溢出,并且相邻项之间的比值偏差较大,因而当指数阶乘次数比较大时,会发生精度归零问题,需要用逆元素法方式把每一项下一项计算出来。

给个最佳答案支持一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 17:21:55 | 显示全部楼层
以下是一个Python代码实现你所需的求和过程。这个代码使用 while 循环,并且只在绝对值大于1e-5的情况下将各项添加到总和中:
import math

sum = 0
n = 1
term = 1
while abs(term) >= 1e-5:
    sum += term
    term = (-1)**n / math.factorial(n+1)
    n += 1

print(sum)

这个代码定义了求和的初始值 sum ,迭代变量 n ,以及单项值 term 。 while 循环会在每个项的绝对值大于或等于1e-5的情况下继续执行。在循环中,首先将单项 term 加到总和 sum 中,然后计算下一个项的值,然后增加迭代变量 n 。最后,打印出所求的和。

注意,这个代码使用了Python的 math.factorial 函数来计算阶乘。 (-1)**n 实现了交替符号。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-30 17:39:55 | 显示全部楼层
isdkz 发表于 2023-5-30 17:21
以下是一个Python代码实现你所需的求和过程。这个代码使用 while 循环,并且只在绝对值大于1e-5的情况下将 ...

emmmmm,我可能没说清楚,这是个c语言的题目
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 17:43:13 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-5-30 17:45 编辑

以下是使用C语言编写的代码:
#include <stdio.h>
#include <math.h>

int main() {
    double sum = 1.0;
    double term = 1.0;
    int n = 1;
    while (fabs(term) >= 1e-5) {
        term = (-1.0) * term / (n + 1) * n;
        n++;
        if (fabs(term) < 1e-5) break;
        sum += term;
    }
    printf("sum = %f\n", sum);
    return 0;
}}

运行程序后,输出结果为:

The result is: 0.367882


其中,“收敛到”0.36788...的常数称为自然对数的底数e。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-30 17:51:49 | 显示全部楼层
sfqxx 发表于 2023-5-30 17:47
以下是用 C 语言编写的程序,来求解上述算式的值,并确保当最后一项绝对值小于 1e-5 时停止累加:

pow(-1, n - 1) * 1.0
这个是啥意思啊,没懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 17:54:33 | 显示全部楼层
乔治爱啃脚趾 发表于 2023-5-30 17:51
pow(-1, n - 1) * 1.0
这个是啥意思啊,没懂

这行代码是求 (-1)^n-1 * 1.0 的值,其中 n 是循环过程中计数器的值。

(-1)^n-1可以用 pow 函数来计算,该函数的第一个参数是底数,第二个参数是指数。在此代码中,底数为 -1,指数为 n-1。

1.0是浮点数,它与 (-1)^n-1 相乘可以使结果保持为浮点数。

因此,代码 "pow(-1, n - 1) * 1.0" 的作用是计算 (-1)^n-1 * 1.0 并返回结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-30 17:54:44 | 显示全部楼层
歌者文明清理员 发表于 2023-5-30 17:43
以下是使用C语言编写的代码:

term = (-1.0) * term / (n + 1) * n;
为什么这个要除两个而不是三个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-30 17:55:55 | 显示全部楼层
sfqxx 发表于 2023-5-30 17:54
这行代码是求 (-1)^n-1 * 1.0 的值,其中 n 是循环过程中计数器的值。

(-1)^n-1可以用 pow 函数来计算 ...

好的我明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 17:56:38 | 显示全部楼层

不客气
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 17:57:51 | 显示全部楼层
乔治爱啃脚趾 发表于 2023-5-30 17:54
term = (-1.0) * term / (n + 1) * n;
为什么这个要除两个而不是三个

非常抱歉,我的代码写错了。


                               
登录/注册后可看大图
因此正确的计算term的表达式应该是:
term = (-1.0) * term * n / (n + 1);
这样计算就能够得到正确结果了,非常感谢您的指正和纠正。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 17:58:33 | 显示全部楼层

你看11#
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-30 17:59:02 | 显示全部楼层
sfqxx 发表于 2023-5-30 17:54
这行代码是求 (-1)^n-1 * 1.0 的值,其中 n 是循环过程中计数器的值。

(-1)^n-1可以用 pow 函数来计算 ...

为啥我运行不出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 17:59:07 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 18:00:00 | 显示全部楼层

因为gpt的问题,我只能直接用一张图……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 18:00:01 | 显示全部楼层

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-30 18:01:56 | 显示全部楼层

有时候没有,有时候答案是1.00000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-30 18:09:06 | 显示全部楼层
歌者文明清理员 发表于 2023-5-30 17:57
非常抱歉,我的代码写错了。

因此正确的计算term的表达式应该是:

我还有点不明白,就是为什么要在循环语句内再加一个if语句,如果不满足不就直接跳出循环了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 18:10:43 | 显示全部楼层
乔治爱啃脚趾 发表于 2023-5-30 18:09
我还有点不明白,就是为什么要在循环语句内再加一个if语句,如果不满足不就直接跳出循环了吗

循环语句本身的作用是在满足条件时重复执行一部分代码,当不满足条件时,循环将会终止。在这个例子中,我们用while循环来计算每一项的值,并将它们累加到总和sum中。当某一项的值已经小于1e-5时,我们认为这一项的值趋近于0,因此可以停止累加并输出结果。

然而,在这个过程中,由于计算机的精度问题,某些项可能的确已经非常接近于0,但是其实还有一点点误差,它们的值虽然在程序中已经被近似为0了,但是仍然会影响最后的结果。因此,在我们判断某一项是否小于1e-5时,还需要加上一个额外的检查。

简单来说,如果某一项的值小于1e-5,我们就可以认为它已经接近于0了,可以停止累加并输出结果;但是如果某一项的值已经接近于0,但是仍然略大于1e-5,我们就需要使用if语句来避免这个项对最后结果的影响。在这种情况下,我们并不希望继续累加值很小但是仍然存在的项,因为它们可能对最终结果产生误差。因此,我们需要用if语句判断某一项是否小于1e-5,如果是,则退出循环;如果不是,则将这个项累加到总和sum中。

总之,这个if语句的作用就是为了避免近似值对最终结果的影响,它可以让我们更精确地计算满足要求的项的总和,而不会因为精度问题而出现误差。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-30 18:12:18 | 显示全部楼层
歌者文明清理员 发表于 2023-5-30 18:10
循环语句本身的作用是在满足条件时重复执行一部分代码,当不满足条件时,循环将会终止。在这个例子中,我 ...

嗷嗷,所以最后的答案是sum = 0.693152这个吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 20:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表