2013-04-26 55 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 2013-04-26 18:50:27

+2

你应该使用整数/长这个。没有浮点素数,速度更快。 – 2013-04-26 18:51:05

+1

这是一种计算素数的蛮力方法。你应该看看费马小定理[这里](http://www.wikihow.com/Check-if-a-Number-Is-Prime)以及一些其他算法,如果你想做大素数。 – Suedocode 2013-04-27 15:39:53

回答

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

我应该使用它,那不是我遇到问题,它为什么不能显示素数。 – 2013-04-26 19:13:07

+1

你应该使用什么?如果divide ==数字没有得到,那么我引用的if块将会失败,并且总是返回“NOT PRIME”。我认为答案已经足够明确 – hop 2013-04-26 19:15:43

+0

我应该使用递归方法。那么应该怎么样呢? – 2013-04-26 19:56:42

1

不是OP想要递归的答案(我想是功课)。

你只需要去,直到n的平方根,看它是否有一个除数(除数除自会<的sqrt(n))的

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 2013-04-26 19:13:26

+0

谢谢,你怎么在java中找到n ^(1/2),我会更新答案 – tgkprog 2013-04-26 19:15:54

+2

'java.lang.Math.pow(n,0.5)'或'java.lang.Math.sqrt()' – hd1 2013-04-26 19:17:29

1

我看你要为这个递归如此,我将tgkprog的答案转换为递归方法(尽管他的效率肯定更高)。另外,如果输入不是素数,我认为你可能想要返回一个素数因子?我只是猜测这从OP的返回值而不是布尔值来判断。尽管如此我会返回一个int,因为返回double是愚蠢的。

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第一次获得问题的权利:) *不确定为什么你在第二个fn有3个参数。只需要2 – tgkprog 2013-04-27 21:58:19

+1

@tgkprog啊是的,那是因为我数了。倒计数会删除“till”参数,因为我不需要再限制检查(只要它仍然> 1)。虽然人们可能会认为素数因子在较小值时密度更高,因此从3开始应该更快地触发素因子。 – Suedocode 2013-04-27 22:35:00

+0

好,即使在这里做了一些人的作业,我想也给了他们一些背景知识。如果他们是真正的开发者,他们会发现新的问题实际解决:-) – tgkprog 2013-04-27 23:03:37

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声明>布尔B = 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,诠释平方和INT G作为那些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

请解释你发布的所有答案。这只是一个代码转储! – 2015-11-24 15:07:13