2013-04-26 4 views
-3

Мне нужно создать программу на Java, которая определяет, является ли число простым.Определение простого числа по пользовательскому вводу с использованием рекурсивного метода

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

import java.util.Scanner; 

public class PrimeNumber 
{ 
public static void main(String[] args) 
    { 
    Scanner input = new Scanner(System.in); 
    int constant = 0; 
    int variable = 0; 
    System.out.println("Enter a Number to test if Prime or Not"); 
    constant = input.nextInt(); 
    variable = constant; 
    double answer = 0.0; 
    answer = testPrime(constant, variable); 
    System.out.println(+answer); 
    if (answer == 1) 
    { 
    System.out.println(+constant + " is a prime number."); 
    } 
    else 
    { 
    System.out.println(+constant + " is NOT a prime number."); 
    } 
    } 

public static double testPrime(int number, int divide) 
{ 
    double prime = 0.0; 
    prime = number%divide; 
    if (prime > 0 && divide != number) 
    { 
    return testPrime(number, divide - 1); 
    } 
    else 
    { 
    return prime; 
    } 
} 
} 
+0

Почему рекурсия? Для этого нет оснований использовать рекурсию. – nhahtdh

+2

Вы должны использовать для этого целое число. Нет простых чисел с плавающей запятой, и это намного быстрее. –

+1

Это простой способ вычисления простого числа. Вы должны посмотреть на Маленькую теорему Ферма [здесь] (http://www.wikihow.com/Check-if-a-Number-Is-Prime), а также некоторые другие алгоритмы, если вы хотите делать большие простые числа. – Suedocode

ответ

2
if (prime > 0 && divide != number) 

Это никогда не будет правдой. Потому что ваше разделение и число всегда равны.

Смотрите, что вы назначили variable=constant и это то, что вы передаете методу

constant = input.nextInt(); 
variable = constant; 
answer = testPrime(constant, variable); 

Это сказало, что вам нужно идти настолько сложным, чтобы выяснить, является ли число простым или нет. Проверьте сеть на наличие простых алгоритмов. См. Например, http://www.mkyong.com/java/how-to-determine-a-prime-number-in-java/.

+0

Я должен использовать его, это не то, с чем у меня проблема, его почему я не могу показать простое число. –

+1

Вы должны использовать что? Разве вы не получили, если divide == number, тогда код if, который я процитировал, будет терпеть неудачу, и он всегда будет возвращать «NOT PRIME».Я думаю, что ответ достаточно ясен – hop

+0

Я должен использовать рекурсивный метод. так что должно быть тогда? –

1

Не ответ, поскольку ОР хочет рекурсии (домашнее задание, я думаю).

Вы должны идти только до квадратного корня из п, чтобы увидеть, если он имеет делитель (делитель, кроме собственной будет < SQRT (п))

boolean isPrime(int n) { 
      if(n % 2 == 0)return false; 
      int till = (int)java.lang.Math.pow(n, 0.5); //(int)n/2; 
      for(int i= 3;i<till;i+=2) { 
       if(n % i == 0) 
        return false; 
      } 
      return true; 
     } 
+1

Фактически, они будут меньше, чем SQRT (n), а не n/2. – hd1

+0

спасибо, правильно, как вы находите n^(1/2) в java, я обновлю ответ – tgkprog

+2

'java.lang.Math.pow (n, 0.5)' или 'java.lang.Math.sqrt()' – hd1

1

Я вижу, что вы хотите рекурсию для этого, так Я перевел ответ tgkprog на рекурсивный метод (хотя он определенно более эффективен). Кроме того, я думаю, вы можете захотеть вернуть основной коэффициент, если вход не является простым? Я просто размышляю над этим, считая из возвращаемого значения OP двойного вместо логического. Mine вернет int, хотя, потому что возвращение двойника глупо.

int isPrime(int n){ //starter function 
     if(n<=1) return n; //sanity check for weird inputs 
     if(n % 2 == 0) return 2; //2 is a prime factor 
     int start = (int)java.lang.Math.pow(n, 0.5); 
     return isPrime(n,start-(start%2)); //makes start odd if it wasn't already 
} 

int isPrime(int n, int testval){ //recursive function 
     if(testval<=1) return 1; //n is prime, return n since it has no prime factors 
     if(n % i == 0) 
      return i; //found a prime factor! 
     return isPrime(n,i-2); 
} 
+1

заметил ваш ответ только после того, как я опубликовал ниже. +1 для получения вопроса в первый раз :) * Не знаю, почему у вас есть 3 параметра во 2-м фн. нужно только 2 – tgkprog

+1

@tgkprog ahh да, это потому, что я подсчитал. Подсчет удаляет параметр «до», потому что мне больше не нужно проверять границы (пока он остается> 1). Хотя можно утверждать, что простые коэффициенты гораздо более плотны при меньших значениях, поэтому начиная с 3 должно приводить к более быстрому удару простых факторов. – Suedocode

+0

все в порядке, хотя я сделал некоторые домашние задания здесь, я думаю, дал им и некоторый фон. если они настоящие разработчики, они найдут новые проблемы, чтобы реально решить :-) – tgkprog

0

с рекурсией

import java.util.Scanner; 

public class PrimeRecursion 
{ 
    static int dbg; 
    public static void main(String[] args) 
    { 
     Scanner input = new Scanner(System.in); 
     System.out.println("Enter non 0 if you want debug :"); 
     dbg = input.nextInt(); 
     long constant = 3; 
     long variable = 0; 
     while(true){ 
      System.out.println("Enter a Number to test if Prime or Not (1 to exit)"); 
      constant = input.nextLong(); 
      if(constant < 3){ 
       if(constant == 2){ 
        System.out.println("2 is a special prime"); 
       } 
       return; 
      } 
      if(constant % 2 == 0){ 
       System.out.println(constant + " is NOT a prime number, even number."); 
      }else{ 
       variable = (long)Math.pow(constant, 0.5); 
       variable = (variable % 2 == 1) ? variable : variable + 1;//odd number 
       double answer = 0.0; 
       answer = testPrime(constant, variable); 
       System.out.println("End answer : " + answer); 
       if (answer == 1){ 
        System.out.println(+constant + " is a prime number. answer : " + answer); 
       } 
       else{ 
        System.out.println(constant + " is NOT a prime number.answer : " + answer); 
       } 
      } 
      System.out.println(); 
     } 
    } 

    static double testPrime(long number, long divide) 
    { 
     double prime = 0.0; 
     prime = (double)number/divide; 
     if(dbg > 0){ 
      System.out.println("Debug number " + number + " | divide " + divide + " |prime : " + prime + " | Math.abs(prime) " + Math.abs(prime)); 
     } 
     if (prime == ((long)prime))//whats the best way to do this? 
     { 
      //divided evenly 
      return divide; 
     } 
     else{ 
      return testPrime(number, divide - 2); 
     } 
    } 
} 
-1

рекурсивная функция для меня идет как-Поправьте меня, если я wrong.Thank you.calling о> Логическое б = IsPrime (номер, номер-1) ; рекурсивный функции-

void isPrime(int p,int d); 
{ 
int prime=p%d; 
if((p==0&&d>1)||p%2==0) 
return true;//that the number is not prime 
if(d==1) 
return false; 
else 
return isPrime(p,d-2);//calls the function again 
} 
-1

Ну я сразу даю вам весь код вместо написания фрагмента кода. Надеюсь, вам все это понравится, поскольку я изо всех сил старался сделать это как можно проще. Код:>

import java.util.*; 
class Prime_Number 
{ 
    static int c=0; 
    public static void main(String args[]) 
    { 
     int n,i,sq=0; 
     Scanner in=new Scanner(System.in); 
     Prime_Number ob=new Prime_Number(); 
     System.out.print("Enter a no.:>"); 
     n=in.nextInt(); 
     i=n; 
     sq=(int)(Math.sqrt(n));//square root is been taken since a no. cannot have factors greater than its square root 
     int k=ob.prime_Chk(n,i,sq); 
      if(k==1) 
       { 
       System.out.println("Prime"); 
       } 
       else 
        { 
         System.out.println("Non-Prime"); 
         } 
     } 
public int prime_Chk(int g,int i,int sq) 
    { 
     if(i==sq) 
     { 
      return c; 
     } 
     else 
     { 
      if(g%i==0) 
      { 
       c++; 
      } 
      i--; 
      return(prime_Chk(g,i,sq)); 
     } 
    } 
} 

Ну в расцвете сил() Я взял INT I, ИНТ кв и ИНТ г как arguments.Instead тех, если вы хотите, то вы можете взять другие переменные также.

-1
import java.util.Scanner; 

public class HW8R_T03 { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Scanner sc = new Scanner(System.in); 
     System.out.print("Enter number: "); 
     int n = sc.nextInt(); 
     int simple = prime(n,n-1); 
     System.out.println(simple==1 ? "prime" : "not prime"); 

    } 

    static int prime(int x, int y){ 
     int div = 1; 
     if (y==0 || y==1){ 
      return div; 
     } 
     if (x%y==0){ 
      div = y; 
     } else { 
      div = prime (x, --y); 
     } 
     return div; 
    } 


} 
+3

Пожалуйста, объясните все ответы, которые вы публикуете. Это всего лишь свалка кода! –

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