collat​​z猜想使用类打印对象的数量和序列

时间:2016-08-25 15:23:18

标签: c++ sequence collatz

    #include<iostream>
    using namespace std;
    class ulam
    {
        int num;
        double prod;
        int cot;
    public:
        ulam(){cot=0;}
        ulam(int x)
        {
            num=x;
        }

        void process()
        {
          for(int i=0;num==1;i++)
          {
            cout<<num<<endl;
            if((num%2) == 0)
            {
              prod=num/2;
            }
            else
            {
              prod=(3*num)+1;
            }
            num=prod;
            cot++;
          }
        }
        void display()
        {
            cout<<"the number of steps required is: "<<cot;
        }
    };
    int main()
    {
        int n;
        cout<<"enter the number"<<endl;
        cin>>n;
        ulam obj(n);
        obj.process();
        obj.display();
    }

当我写这个代码时,我认为cot值是一个垃圾值。我无法弄清楚我哪里出错了。我上过课,因为我觉得它更具描述性。但这个程序背后的主要目的是找到一个数字达到一个并打印整个数字序列所需的步骤数。对于那些不了解坍塌猜想的人来说https://en.wikipedia.org/wiki/Collatz_conjecture

2 个答案:

答案 0 :(得分:1)

for循环内部过程函数的条件是错误的。它应该是composer install。您还需要初始化num!=1。实际上你并不需要cot

prod

答案 1 :(得分:0)

第一个问题

在传递整数时初始化的构造函数中, ALSO 必须像这样初始化cot

ulam(int x)
{
    cot = 0;
    num = x;
}

更好的是,因为cot在构造时总是0,所以只需将cot设置为0作为私有变量,如下所示:

class ulam
{
   int num;
   double prod;
   int cot = 0;
public:
  //....
};

这意味着您仍然可以使用无效的默认构造函数,而获取整数的构造函数不需要将cot设置为0

第二个问题

你的第二个问题是循环条件错误。它应该是num != 1,而不是num == 1num == 1将永远不会运行循环,除非在cin中传递了1。