2015-07-17 2 views
-6

Я создал программу проверки простого числа, которая проверяет введенный пользователем номер простой или нет.Что не так с моей Prime Checker?

Он легко обнаруживает простые числа, но когда мы печатаем простые числа, он падает!

Я думаю, я знаю, почему, но не знаю, как исправить их ...

Вот моя программа:

#include "stdafx.h" 
#include <iostream> 
#include<iomanip> 
#include <cmath> 
using namespace std; 



float Asker() 
{ 
    float n; 
    cin >> n; 
    return n; 
} 


int Remainder(int n, int x) 
{ 
    int q = n%x; 

    if (q == 0) 
     return 1; 

    else 

     Remainder(n, x + 1 > n); 
    /* 
    Here is the PROBLEM 
    */ 
    return 0; 
} 


int main() 
{ 
    cout << "Enter your Number : "; 
    float n = Asker(); 

    int r = Remainder(n, 2); 

    if (r == 1) 
     cout << "That Ain't Prime!\n"; 
    else 
     cout << "Yep Thats Prime!\n"; 

    main(); 

    return 0; 
} 

Предположим, когда я вхожу 7, я знаю, что он проверяет до 6, то он должен сработать! (из-за условия x + 1> n). Я не знаю, как вернуть 0, когда он не прошел условие else ...

+2

Почему бы вам не попробовать итеративное решение, его проще и понятнее реализовать – Chris

+1

Я считаю, что ваш код даже не компилируется. –

ответ

-1

Прежде всего, вам не нужно проверять по модулю для всех номеров до n-1: достаточно проверить по модулю до sqrt(n). Во-вторых, вы должны вернуть 0 из функции, если следующий делитель для проверки больше sqrt(n). Вот исправленная функция Remainder.

int Remainder(int n, int x) 
{ 
    int q = n%x; 
    if (q == 0) 
     return 1; 
    else 
    { 
     if(x+1 > std::sqrt(n)) return 0; 
     else return Remainder(n, x + 1); 
    } 
} 

Наконец, лучше изменить тип n в main и Asker от float к int, и тип возвращаемого Asker должен быть int тоже.

Это не исчерпывающий список того, что не так с простым контролером числа в фокусе - просто способ быстро его исправить. По сути, такая простая проверка числа не должна использовать рекурсию - более аккуратно просто перебирать все потенциальные делители от 2 до sqrt(n). «? Что случилось с моим номером премьер Checker»

1

Чтобы ответить на ваш вопрос много вещей неправильно:

  • Не называйте main() в основном. Это не так, как вы рекурсии
  • int Remainder(int n, int x) и вы называете его с float (литая отсутствует), то с bool: Remainder(n, x + 1 > n);
  • Ваш asker не нужно быть поплавком

О рекурсии в пределах main есть две причины:

  • С помощью этой конфигурации вы получите конец меньше петли;
  • ISO C++ запрещает принимать адрес функции ':: магистральный'

+0

Принимаю ваши другие баллы, но почему бы мне не называть main() в главном? –

+0

@JebinMatthew отредактировал ответ –

1
//#include "stdafx.h" //This is an invalid header. 
#include <iostream> 
#include<iomanip> 
#include <cmath> 
using namespace std; 



float Asker() 
{ 
    float n; 
    cin >> n; 
    return n; 
} 


int Remainder(int n, int x) 
{ 
    int q = n%x; 

    if (q == 0 && n>2)//'2' have to be excluded. 
        //otherwise 2%2==0 can set 
        //'2' as a non prime which is wrong 
     return 1; 

    else if(x+1<n) 

     Remainder(n, x + 1); 
    /* 
    Here was the PROBLEM 
    Remainder(n, x + 1 > n) 'x + 1 > n ' is an invalid paramrter. 
    */ 
    else 
     return 0; 
} 

    int main() 
{ 
    cout << "Enter your Number : "; 
    float n=Asker(); 
    int r=1;  //It is essential to initialize r to 1 

    if(n!=1)  //Have to exclude '1'. Otherwise 
       //It will assign '1' as prime which is wrong 
     r = Remainder(n, 2); 

    if (r == 1) 
     cout << "That Ain't Prime!\n"; 

    else 
     cout << "Yep Thats Prime!\n"; 
    //main(); //Why are you calling main again? 

    return 0; 
} 
  1. Ваша первая ошибка была "#include "stdafx.h"". Откуда у вас этот заголовок?
  2. Затем внутри функции int Remainder (int n, int x) вы использовали рекурсию и отправили недопустимый синтаксис «Remainder (n, x + 1> n)».Вы не можете использовать синтаксис, например x + 1> n в параметре.
  3. После этого, почему вы вызываете main() внутри основной функции? И ваш алгоритм нуждался в некотором касании, которое я добавил и объяснил в комментарии.

Но вы должны знать, что самый короткий способ проверить простое число - проверить n% x == 0 до x < = square_root (n).

+0

@JebinMatthew есть ли какие-либо проблемы с ответом, который я дал? –

Смежные вопросы