2014-10-23 3 views
0

Я должен найти, является ли заданное число простым числом или нет, пока не будет задано число, равное -1. Когда я вводим номер, он либо возвращается, как все простые числа, либо все отрицательные числа.У меня возникли проблемы с кодом, чтобы определить, является ли число простым числом или нет.

#include <iostream> 
#include <stdio.h> 
using namespace std; 

int main() 
{ 
int number, count; 

count = 0; 

cout << "Enter positive numbers. Enter -1 to quit." << endl; 
cout << "Enter number: "; 
cin >> number; 

while (number != -1) 
{ 
    for (int i = 2; i <= number-1; i++) 
    { 
     if (number%i == 1) 
      count++; 
      break; 
    } 
    if (count == 1) 
     cout << number << " is not prime number" << endl; 
    else 
     cout << number << " is prime number" << endl; 

    cout << "Enter number: "; 
    cin >> number; 
} 
cout << "Program is terminated"; 
} 
+3

Пробовали ли вы использовать отладчик для выполнения кода? –

ответ

1
  1. В этой строке

    if (number%i == 1) 
    

    вы, скорее всего, хотите узнать, «если number делится на i», что эквивалентно «оставшейся части number деленное на i является ноль ". Следовательно, вам нужно написать

    if (number%i == 0) 
    
  2. Ваш break; странно. Как это сейчас, это не в пределах if -block, и, следовательно, вы выходите из цикла на самой первой итерации. Вы должны заключить тело вашего if с фигурными скобками:

    if (number%i == 1) { 
        count++; 
        break; 
    } 
    
  3. count переменными должно быть обнулены после (или до) каждого испытание простого числа. Или лучше: переместите его декларацию непосредственно перед циклом for, чтобы избежать такого непреднамеренного повторного использования старых значений.

  4. Пожалуйста, напишите полное числовое число как функцию. Это также уменьшает необходимость как для переменной count, так и для break, так как вы можете просто return, как только найдете дивизор. Это, в свою очередь, устранило проблемы 2. и 3. полностью.

  5. В качестве оптимизации вы можете заметить, что вам нужно только проверить до i*i > number. Это верно, так как если большее i может быть делителем, результатом деления будет меньше i, и, следовательно, вы уже нашли его раньше. Поэтому используйте i*i <= number как условие для цикла.

0

Первая проблема, которую я вижу, - это идея count++. Если программа вызывается снова, то у нас есть наш старый счет. Если у нас есть наш старый счет, то, если следующее число является простым, это фактически говорит нам, что число не является простым. Точно так же, если мы будем продолжать этот счет и сталкиваться с нечетным числом, тогда мы делаем счет равным 2. Это еще большая проблема, потому что теперь мы говорим, что не простые числа являются простыми.

В стороне, у меня есть функция, написанная на C on github, которая делает некоторые вещи isprime.

Удачи!

+2

Полностью отключен от темы, но те строки '/ ** /' комментариев в коде 'C' ужасны, и любой, кто должен поддерживать ваш код, ненавидят вас навсегда. – Blastfurnace

+0

@Blastfurnace Мне недавно сообщили об этом ... Я полагаю, что это старая привычка, связанная с сохранением моего кода. Что такое хороший способ сделать что-то подобное, но без глупых ящиков? –

+0

Мой глупый совет - полностью забыть о том, чтобы отложить линии в любом случае. Я не думаю, что это улучшает читаемость, это ужасный кошмар, чтобы все это синхронизировалось (если ваш текстовый редактор не делает это автоматически, а что касается плохого программиста по обслуживанию с другим редактором), и он раздувает размер ваших исходных файлов , – Blastfurnace