而回路逻辑澄清+谐波级数

While loop logic clarification + harmonic series

本文关键字:回路      更新时间:2023-10-16

这是我的代码,用于查找1/n的调和级数的和。当总和大于或等于15时,我希望它停止,但代码无法运行。有人能告诉我我做错了什么吗?它似乎遵循了正确的while循环结构。谢谢

#include <iostream>
using namespace std;
int main ()
{
    int divisor = 1;
    int sum = 1;
    while ((sum <= 15) && (divisor >=1))
    {
        sum = sum + (1/divisor);
        divisor++;
    }
    cout << "You need " << divisor << " terms to get a sum <= 15" << endl;
    return 0;
}

您的循环实际上正在运行。但是,sum变量的类型是intdivisor也是。

1(int)/除数(也是int)将返回1或0。这是因为你在做整数除法。1/1 == 1。然而,1/2 == 01/3 == 0等……要解决此问题,请将除数强制转换为双倍:

(1 / (double)divisor)

这样就解决了该段只返回1或0的问题。但是,由于sum的类型为int,因此您仍将获得1的和。尝试将double分配给int变量将导致截断或底部舍入。Sum将添加第一个1,但此后它将无限期地保持1。为了解决此问题,请将sum的类型更改为double

您分配的sum = 1;是一个逻辑错误。你的结果会比应该的高1。你的输出语句也错了。。。应该是…

cout << "You need " << divisor << " terms to get a sum > 15" << endl;

此外,divisor >= 1的条件是不必要的。。。它总是大于或等于1,因为你把它赋值为1并且正在递增。。。如果您确实想要>= 15的总和,请将while条件更改为…

while (sum < 15)

你的代码应该是这样的。。。

#include <iostream>
using namespace std;
int main()
{
    int divisor = 1;
    double sum = 0; //Changed the type to double and assigned 0 rather than 1
    while (sum <= 15) //While condition shortened...
    {
        sum = sum + (1 / (double)divisor); //Added type cast to divisor
        divisor++;
    }
    //cout statement adjusted...
    cout << "You need " << divisor << " terms to get a sum > 15" << endl;
    return 0;
}