Программа простых простых чисел .... Что не так с моим кодом / скриптом? - PullRequest
0 голосов
/ 27 октября 2011

Мне интересно, я могу получить некоторую помощь при отладке или обнаружении ошибки в моей программе.Цель состоит в том, чтобы получить пользовательский ввод и затем отобразить простые числа от ввода до нуля, от наибольшего простого к низшему.

Проблема состоит в том, что выходные данные включают пользовательский ввод, который может быть или не быть простым числом, и повторяет простые числанесколько раз :( Кроме того, мне интересно, почему 2 не входит?

Мой код:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int prime, division, input;
    cout << "Please enter a number you wish to count down prime numbers from." << endl;
    cin >> input;

    for (prime = input ; prime >=2 ; prime-- )
    {
        for (division = 2 ; division < prime ; division++ )
        {
            if (prime % division == 0)
            {
            break;
            }
            else
            {
            cout << prime << " ";
            }
        }
    }
    return 0;
}

Мой вывод:

Пожалуйста, введите номер, который вы хотитеотсчет простых чисел от. 15

15 13 13 13 13 13 13 13 13 13 13 13 11 11 11 11 11 11 11 11 11 9 7 7 7 7 7 5 5 5 3

Спасибо за помощь!

Ответы [ 5 ]

1 голос
/ 28 октября 2012

Это программа, которая сообщает, является ли введенное число простым или нет. Любое число полностью делится на число, которое всегда меньше его.В случае простых чисел они полностью делятся на 1 и на себя;Поэтому я использовал переменную-счетчик, которая подсчитывает, сколько раз число полностью делится на число или число, меньшее его.Счет будет всегда 2 для простых чисел и счет будет больше двух для других.Счет будет 1 для одного ... Таким образом, программа выглядит следующим образом ....

    #include<iostream.h>
    #include<conio.h>
    class prime
    {
       int a;
       public:
         void check();

    };
       void prime::check()
                         {
                          cout<<"Insert a number";
                          cin>>a;
                          int count=0;
                          for(int i=a;i>=1;i--)
                             {
                                if(a%i==0)
                                      {
                                        count++;
                                       }
                               }
                                 if(count==1)
                                           {
                                cout<<"\nOne is neither prime nor composite";
                                            }
                                  if(count>2)
                                           {
                                cout<<"\nthe number is not prime its composite" ;
                                           }
                                 if(count==2)
                                          {    
                                cout<<"\nthe numner is prime";
                                           }
             }

     void main()
     {
      clrscr();
     prime k;
     k.check();
     getch();
     }

Для печати всех простых чисел, меньших, чем число, указанное в качестве ввода;код выглядит следующим образом:

      #include<iostream.h>
      #include<stdio.h>
      #include<conio.h>
        class prime
        {
               int a;
               int i;
        public:
          void display();
        };

          void prime::display()
                   {
                     cout<<"Enter any number to find primes less than it";
                     cin>>a;
                        int count=0;
                     for(int j=a;j>=1;j--)
                      {
                        for(int i=1;i<=j;i++)
                             {
                                if(j%i==0)
                                         {
                                           count++;
                                          }
                               }
                        if(count==2)
                                   {
                                     cout<<"\n"<<j;
                                    }
                         count=0;
                        }
                  }
     void main()
     {
        clrscr();
        prime k;
        k.display();
        getch();
      }
0 голосов
/ 27 октября 2011

Ваш внутренний цикл не верен.Это не печать простых чисел, просто нечетные числа.Он проверяет, делится ли число на 2 во время первой итерации, и четное число всегда будет делимым.Таким образом, внутренний цикл всегда прерывается, если число четное, но печатает номер, если он нечетный, и продолжает это делать до тех пор, пока цикл не прекратится или не прекратится.

Давайте попробуем получить это на примере, внешний цикл равен 9. Внутренний цикл проверит, делится ли он на 2, так как он не распечатает число и продолжит снова.Следующая итерация проверит, делится ли она на 3, так как она вспыхнет.

И попробуйте использовать функцию, чтобы проверить, является ли число простым, что делает его более модульным.Вот немного оптимизированная версия ...

bool prime(int num)
{
    int root = sqrt(num);
    if(num == 2)
        return true;
    if(num%2 == 0)
        return false;
    for(int i=3;i<=root+1;i=i+2)
        if(num % i == 0)
           return false;
    return true;
}
0 голосов
/ 27 октября 2011

Попробуйте этот код

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int prime, division, input;
    cout << "Please enter a number you wish to count down prime numbers from." << endl;
    cin >> input;




    for (prime = input ; prime >=2 ; prime--)
    {
        boolean isDivisible = false;
        for (division = 2 ; division < prime ; division ++)
        {
            if (prime % division == 0)
            {
                isDivisible = true;
            }
        }
        if (isDivisible == false)
        {
            cout << prime << " ";
        }
    }
    return 0;
}
0 голосов
/ 27 октября 2011

Проверьте свой внутренний цикл.При каждом прохождении цикла ваш инициализатор сбрасывается до 2. Затем вы делаете Мод 2 на предполагаемом простом числе.Если вы получите 0, все, что вы действительно знаете, это то, что число четное.Это может привести к тому, что вы быстро скажете, что число не простое, но 2 mod 2 равно 0, а 2 простое.После цикла «деление» становится 3. 15 mod 3 равно 0. В этот момент вы выходите из цикла, но 15 НЕ является простым.Проверьте свой алгоритм для определения простых чисел.Вы можете проверить это на известные простые числа, но это недостаточно динамично.Есть и другие методы, один из которых вращается вокруг определения квадратного корня подозреваемого простого числа.Наконец, вы могли бы сделать какую-нибудь старую (длинную) отладку бумажным карандашом.

0 голосов
/ 27 октября 2011

Для первой задачи:

для 9, когда печатается division == 2, 9 % 2 ==1, поэтому 9. Вместо Вас должно быть значение флага для обозначения, является ли число простым или нет, инапечатайте число после того, как убедитесь, что оно простое.

Для 2: РЕДАКТИРОВАТЬ: когда prime == 2, а поскольку division < prime - это условие выполнения внутреннего цикла, внутренний цикл выходит без выполнения.Все кредиты идут в Marlon!

...