2013-07-31 3 views
-5

// Я должен делать это с помощью циклов и утверждений решений, но он не работает. Помогите!Программа должна определить, является ли входной номер простым или нет.

import java.util.Scanner; 
public class main { 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     //Declare variables 
     Scanner abc; 
     abc = new Scanner (System.in); 
     int input; 
     int divide = 2; 
     int count=0; 

     //Ask for input 
     System.out.println("Please enter an integer to determine if it is prime"); 
     input = abc.nextInt(); 

     //Do math 
     for (int x=1; x < input; x++) { 
      if ((input%divide) == 0) 
       count += 1; 
      divide = divide + 1; 
     } 

     if (count == 0) 
      System.out.println("It is a prime number"); 
     else 
      System.out.println("It is not a prime number"); 
    } 
} 
+1

Что не работает? Также вам нужно всего лишь перейти к квадратному корню из числа – exussum

+0

Говоря строго об эффективности, вы можете сначала проверить, нет ли даже проверки 'if (input% 2 == 0)' (если это так,), а затем проверить только нечетные числа (начиная с 3) до квадратного корня из проверенного числа. – 3yakuya

+0

Я бы сделал некоторые исследования; эта проблема была решена древними греками. Ищите сито Эратосфена: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes – duffymo

ответ

1

for (int x=2; x < input; x++) (изменить x=1 к x=2)

иначе вы в конечном итоге пытается разделить 5 на 5, чтобы тест, если 5 первична

+0

не разделен х. – Ankit

+0

на самом деле это правильно, так как 'split' всегда один больше, чем' x', последний цикл итерации будет разделен равным входному lol – jlars62

+0

@ ay89, вы, вероятно, не видите, что x управляет числом итераций цикла, что приводит к последнему значение переменной 'divide', чтобы попасть в номер. – necromancer

1

Вы подсчета числа делителей; все, что вам нужно сделать, это определить, существует ли хотя бы один делитель. Вот лучший алгоритм:

function isPrime(n) 
    if n is even 
     return n == 2 
    d := 3 
    while d * d <= n 
     if n % d == 0 
      return False 
     d := d + 2 
    return True 

Я обсуждаю этот алгоритм, среди прочего, в статье Programming with Prime Numbers в моем блоге, который включает в себя реализацию в Java.

1

Похоже, что count должен посчитать число факторов input не считая 1 и input. Для удобства чтения я бы рекомендовал использовать имя типа numOfFactors вместо count.

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

(1) Что x и divide первый раз, когда вы идете через петлю, в начале цикла?

(2) Если вы посмотрите на то, что происходит с x и divide, есть простое соотношение между x и divide в начале каждые раз через петлю. Что это?

(3) Что такое xПоследнее Время, прошедшее через цикл?

(4) Основываясь на ответах на # 2 и № 3, что такое divide в начале последнего времени через цикл? Каким будет значение% divide равным?

Вот почему он не работает. Сначала сделайте это. Затем мы можем поговорить о том, как сделать работу более эффективной.

БОЛЬШЕ: Хорошо, я скажу еще одну вещь. Если все, о чем вы заботитесь, равно нулю count, вы можете выйти из цикла, как только найдете фактор. Как это:

if ((input%divide) == 0) 
{ 
    count += 1; 
    break; 
} 

(. И если вы делаете это таким образом, то вместо count вы должны использовать boolean foundAFactor, потому что все это говорит, нашли ли вы фактор, не сколько есть)

Но если вы действительно хотите знать точное количество факторов, не делайте этого.

2

В ваш цикл, для последней итерации, x = input - 1, но это означает, что divide = inputdivide было один больше в начале, и вы увеличиваете как раз в итерацию цикла), так что рассчитывать на самом деле будете равна 1 если число является простым, а не 0.

1

Здравствуйте сделать это следующим образом:

for(int i = input-1; i > 0; i--) { 
    if((input % i) == 0) { 
      if(i == 1) 
       System.out.println("is a prime"); 
      else 
       System.out.println("is not a prime"); 
      break; 
    }  
} 
+0

хороший ответ :-) – necromancer

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