2013-05-22 23 views
1

我正在尝试编写一个程序,该程序使用谓词方法来查找1-100之间的所有素数。我知道现在有更有效的方法来寻找素数,但是现在我想使用强力策略并尝试所有可能的组合。

现在的程序就是这样,只是打印真假10000次,但我希望我的程序只打印数字,如果它们是素数。所以在程序完成后,我会得到一个介于1到100之间的素数列表。

1.我的程序是否正确? 2.什么是最好的建议改变我的程序,以便它列出1-100之间的所有素数。编写一个方法来查找素数

import acm.program.*; 
public class PrimeNumbers extends ConsoleProgram{ 
public void run(){ 

    for (int i =1; i <= 100, i++){ 
     for (int j =1; j<= 100; j++){ 
      println(yesPrime(i, j)); 
     } 
    } 
    } 

private boolean yesPrime (int n, int k){ 
     return (n % k == 0) 

     } 
    } 
    } 
+0

'yesPrime '只检查n是否可以被k整除。那真的是你想要的吗? – FDinoff

+0

只是一个提示:为了通过使用蛮力来查找素数,您需要验证数字N是否只能由1和自身整除。你的'yesPrime'方法不处理这个问题。 –

+0

您可能想要使用http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes – Bill

回答

10

您不检查素数。您正在测试从1到100两个数字的所有10,000个组合,以查看第二个数字是否均匀分配。

但它很可能是正确的。

伪代码为你想要做什么:

for each number n from 2:100 
    for each divisor d from 2:n-1 
     test to see if d divided n evenly 
    end for 
    if no values of d other than n divided n evenly 
     print "n is prime" 
end for 

一对夫妇的优化,为您思考的:

  • 你的内环只需要上去的sqrt(N)。 (为什么?)
  • 而不是所有的数字,你只需要检查它是否划分你已经找到均匀的奇素数。 (为什么?)

玩得开心!

+3

除数d的范围可以从2到sqrt(n) - 这为较大的数字节省了一点时间。但是,这不是真正重要的,只是想提起它:) –

+0

谢谢!我在。 – John

+0

@John中加入了当我的程序打印出10000个真或假的时候,我的程序在碰到素数时是否返回true?或者我的程序完全不正确? –

1

那么,您将返回yesPrime的比较,然后将该比较的结果打印在run中。猜猜输出是什么。

考虑到这是一项任务,我想给你一个提示,而不是答案。

检查yesPrime的结果。如果为true,则打印该号码并跳出循环。

0

我会做一个功能,就像你的yesPrime功能。这只需要一个数字,然后检查该数字是否为总数。

喜欢的东西

boolean yesPrime(int n) 
{ 
    // check to see if n is divisble by numbers between 2 and sqrt(n) 
    // if the number is divisible, it is not prime, so return false 
    // after the loop has checked all numbers up to sqrt(n), n must be prime so return true 
} 

然后在你的主程序,遍历数字1到100,并呼吁yesPrime每个号码。如果结果为真,则打印该号码。

我的努力是编程的一个目标是将问题分解成更小的子问题。通过编写一个函数来测试素数,可以避免在一个函数中使用嵌套循环,这可能更难理解。

0

对于初学者,您需要检查从2开始的素数。而且您不会针对所有100个数字进行检查,只是将每个数字作为从2到数字1的一个因子。每个数字都可以被整除由1和本身。

public static void main(String[] args) { 
    boolean b; 
    for (int i = 2; i < 100; i++) { 
     b = checkPrime(i); 
     if (b) 
      System.out.println(i); 
    } 
} 

private static boolean checkPrime(int k) { 

    for (int i = 2; i < k; i++) { 
//check if the number is divisible by any number starting from 2 till number -1.If it is, it is not a prime number 
     if (k % i == 0) 
      return false; 
    } 
// return true if the number is not divisible by any number from 2 to number -1 i.e. it s a prime number. 
    return true; 
} 
+0

单纯的代码不是答案。你需要提供一个解释。此代码包含无法解释的冗余。 – EJP

+0

我已经删除了1个冗余。请指出,如果我错过了任何事情。 – Adarsh

3

使用埃拉托色尼的筛子:

public static void main(String[] args) { 

    int n = 100; // the max number for test 

    // Sieve of Eratosthenes 
    boolean[] sieve = new boolean[n + 1]; 
    for (int i = 2; i <= n; i++) { 
     sieve[i] = true; 
    } 
    for (int i = 2; i <= n; i++) { 
     if (sieve[i] != false) { 
      for (int j = i; j * i <= n; j++) { 
       sieve[i * j] = false; 
      } 
     } 
    } 

    // Print prime numbers 
    for (int i = 0; i <= n; i++) { 
     if (sieve[i]) { 
      System.out.println(i); 
     } 
    } 

} 
+0

恩,这段代码在n 157422中不起作用。正确的答案是14475,但是这段代码返回14474. – AKS

+0

你是否用long变量改变了int变量? =) –

0

想想这个逻辑
所有数能被2整除不是素数,因此您可以通过2
增加你的电话号码,如果号码不由素数整除那么它是一个素数

试试这个代码

public static void main(String[] args) throws IOException 
    { 
     int[] prime=new int[50]; //array to store prime numbers| within 1 to ==> prime numbers will be <=n/2 here n=100 
     int i=1;  //index for "num" array 
     int j=1;  //index for storing to "prime" array 
     int k=1;  //index for browsing through prime array 
     prime[0]=2;  // setting the first element 
     int flag=1;  // to check if a number is divisibe for than 2 times 
     for(i=3;i<=100;i+=2) { 
      for(k=0;prime[k]!=0;k++) //browsing through the array to till non zero number is encountered 
      { 
       if(i%prime[k]==0) flag++; //checking if the number is divisible, if so the flag is incremented 
      } 
      if(flag<2) 
      { 
       prime[j++]=i;    // if the flag is still 1 then the number is a prime number 
      } 
      flag=1; 
     } 
     System.out.println(Arrays.toString(prime)); //a short way to print an array 
     } 
0

在给定的范围内找到素数很容易 /* 请实现此方法以返回给定范围(包含)中的所有素数列表。质数是一个自然数,它有两个不同的自然数除数,它们分别是1和素数本身。第一素数是:2,3,5,7,11,13 */

public void getPrimeNumbers(int st, int en){ 
    // int st=1, en=100; 
    for(int i=st;i<=en;i++) 
     if((i%2!=0) && (i%1==0 && i%i==0)) 
      System.out.println("Yes prime");  
} 
+0

假设'st'是第一个数字,'en'是间隔的最后一个数字,这只会打印奇数。 –

+0

'i%1 == 0'和'i%i == 0'总是如此。正如胡安所说,只有单数印刷。这个答案应该被忽略。 – h3xStream

0
public static void main(String[] args) { 

    boolean isPrime = true;    //set isPrime to true 

    for (int i = 2; i<100;i++){   // consider i is increasing number 

     for (int j=2; j<i; j++)   //j is divisor & must be less than 
             //i and increasing after each iteration 
     { 
      if((i % j)== 0){    // if i gets divisible by 
             // any increasing value of j from 2 
             //then enters in this case and makes value 
             //nonPrime 
       isPrime=false;  //changes value 
      break;     //breaks "for loop of j" 
     } 
      }    //ends "for loop of j" 
     if(isPrime)   // if case wont work then number is prime 
     { 

      System.out.println(i + " is Prime"); 
     } 
     isPrime = true;  //sets isPrime to default true. 
    } 
    } 
+0

是最简单的方法。不使用数组和任何IOException或任何其他方法。 – AmanSingh

1
Scanner reader = new Scanner(System.in); 
    System.out.println("Enter the a number"); 
    int num = reader.nextInt(); 
    int counter = 0; 
    int root = 0; 
    boolean prime_flag; 

    if (2 <= num) { 
     // 2 is the only even prime number 
     counter++; 
    } 

    for (int i = 3; i < (num + 1); i++) { 

     // test only for odd number 
     if (i % 2 != 0) { 
      prime_flag = true; 
      root = (int) (Math.sqrt(i) + 1); 

      for (int j = 3; j < (root + 1); j++) { 
       if ((i % j == 0) && (i != j)) { 

        prime_flag = false; 
        break; 
       } 
      } 

      if (prime_flag) { 
       counter++; 
      } 

     } 

    } 

    System.out.println("Count of prime numbers upto " + num + " is " 
      + counter); 
0

随着较不复杂的方法,我们可以这样做:

import java.math.BigInteger; 

public class PrimeNumbers { 

    public static void main(String[] args) { 
     BigInteger min = new BigInteger("2"); 
     BigInteger max = new BigInteger("100"); 

     while(min.compareTo(max) < 0){ 

      System.out.println(min); 
      min = min.nextProbablePrime(); 

     } 

    } 
} 
相关问题