如何用C++编写二三串程序

rjee0c15  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(141)

我有一个CS问题,它说:
我们定义一个级数2 3为一个第一项为某个自然数的级数。如果级数中的成员数n的值为x,则级数中第(n +1)个成员的值为:(x % 2 ==0)?x/2:x*3 +1。
你必须编写一个程序,打印两个或三个系列,从数字1到25开始(不包括),但当生成的值大于1000或值已出现在前一系列中时,将停止创建每个系列(因此,从该数组向前生成的子系列已经生成)。生成的值必须再次显示,从而停止该系列的生产。
现在我写的代码输出了一个与解决方案输出类似的结果,但是它需要做一些修改才能得到相同的结果,这是我的代码。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

int main()
{
int array[25];

    for (int i = 1; i < 25; i++)
    {
        int currentNum = i;
        int theNumAfter;
        bool occured = false;
    
        while (occured == false)
        {
            for (int i = 0; i <= 25; i++)
            {
                if (array[i] == currentNum)
                {
                    occured = true;
                    cout << endl;
                }
            }
    
            array[currentNum] = currentNum;
    
            cout << currentNum << " ";
    
            if (currentNum % 2 == 0)
            {
                theNumAfter = currentNum / 2;
            }
            else
            {
                theNumAfter = (3 * currentNum) + 1;
            }
    
            array[theNumAfter] = theNumAfter;
    
            cout << theNumAfter << " ";
            currentNum = theNumAfter;
        }
    }

}

代码不接受任何输入,只有一个正确输出,应该是:
我代码结果:
我应该在代码中改变什么,所以我们有匹配的输出。提前感谢

6fe3ivhb

6fe3ivhb1#

当产生大于1000值或已经出现在先前系列中的值时,将停止创建每个系列。
直到24,生成的值都不大于1000,但是发布的代码仍然有一个访问越界错误:

int main()
{
    int array[25];
    //        ^^
    for (int i = 1; i < 25; i++)
    {
        int currentNum = i;
        int theNumAfter;
       
        // ...
            array[currentNum] = currentNum;
        // ...
            array[theNumAfter] = theNumAfter;
        // ...
   }
   // ...
}

请注意,预期输出中的许多数字大于25。
我不知道这部分应该达到什么效果:

for (int i = 0; i <= 25; i++)
{ //            ^^^^^^^   it "checks" only the first 25 values that may occur
     if (array[i] == currentNum)
     {
          occured = true;
          cout << endl;      // <-- The duplicate should be printed before the newline.
                             // Here it should break out of the loop.
     }
}
array[currentNum] = currentNum;
cout << currentNum << " ";

但它未能产生预期的输出。
我会用一个简单的1000个bool的数组来记住已经出现的数字。

#include <iostream>

int main()
{
    constexpr int limit{ 1'000 };
    bool already_seen[limit + 1]{};

    for (int i = 1; i < 25; i++)
    {
        int current{ i };
        while ( current <= limit  and  not already_seen[current] )
        {
            std::cout << current << ' ';
            already_seen[current] = true;

            if ( current % 2 == 0)
            {
                current /= 2;
            }
            else
            {
                current = (3 * current) + 1;
            }
        }
        std::cout << current << '\n';
    }
}

可测试here

相关问题