Гипотеза Коллатца, чтобы напечатать количество объектов и последовательность, используя класс

    #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();
    }

когда я пишу этот код, я думаю, что значение детской кроватки оказывается мусором. Я не могу понять, где я ошибся. Я использовал класс, потому что считаю, что он более понятен. но основная цель этой программы - найти количество шагов, необходимое для того, чтобы число достигло единицы, и распечатать всю последовательность чисел. для тех, кто не знает о гипотезе Коллатца https://en.wikipedia.org/wiki/Collatz_conjecture


person ishfaq miraj    schedule 25.08.2016    source источник
comment
ulam(int x) никогда не устанавливает cot   -  person NathanOliver    schedule 25.08.2016
comment
вы можете установить начальное значение во время объявления, int cot = 0;   -  person Ricardo Pontual    schedule 25.08.2016


Ответы (2)


Ваше состояние цикла for внутри функции процесса неверно. это должно быть num!=1. Вам также нужно инициализировать cot. На самом деле вам не нужно prod.

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

    void process()
    {
      for(int i=0;num!=1;i++)
      {
        cout<<num<<endl;
        if((num%2) == 0)
        {
          num=num/2;
        }
        else
        {
          num=(3*num)+1;
        }
        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();

    return 0;
}
person MD. Khairul Basar    schedule 25.08.2016

Первая проблема

В конструкторе, в котором вы инициализируете при передаче целого числа, вам ТАКЖЕ нужно инициализировать cot следующим образом:

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

А еще лучше, поскольку кроватка всегда будет 0 при строительстве, просто установите cot в 0 в качестве частной переменной, например:

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

Это означает, что у вас все еще может быть конструктор по умолчанию, который ничего не будет делать, а тот, который принимает целое число, не требует установки cot в 0.

Вторая проблема

Вторая проблема в том, что условие цикла неверное. Это должно быть num != 1, а не num == 1. num == 1 цикл никогда не будет запущен, если 1 не будет передан в cin.

person Arnav Borborah    schedule 25.08.2016