[英]Print all prime numbers between two given numbers in Java only
大家,我試過這個程序,但沒有得到預期的答案,請幫幫我。
問題是:
打印兩個給定數字之間的所有質數。 例如:函數是Prime(beg,end)
,對於Prime(4,7)
它將返回 {5,7},對於Prime(7,16)
它將返回 {7,11,13}。 我的代碼:
package com.robin.practise;
import java.util.Scanner;
public class PrimebetweenRange
{
private static String Prime(int beg, int end)
{
String res= " ";
for(int i= beg; i<= end; i++)
{
for(int j=2; j<= end; j++)
{
if(i%j!= 0)
{
//System.out.println(i+ " ");
res= i+ " ";
}
}
}
return res;
}
public static void main(String[] args)
{
Scanner scn= new Scanner(System.in);
System.out.println("Enter any two numbers: ");
int n1= scn.nextInt();
int n2= scn.nextInt();
scn.close();
System.out.println(Prime(n1, n2));
}
}
如果一個數不能被一個數整除,你就不能決定一個數是素數。 您需要在內循環結束時添加到結果中。
您的代碼中有很多問題。 這是工作的
for(int i= beg; i<= end; i++) {
boolean prime = true; //start by assuming the current number is prime
for(int j=2; j<i; j++) { // Loop till j < i
if(i%j == 0) {
prime = false; //Set the current number as not prime if it is divisible by any number lesser than it
}
}
if (prime) {
res += i+ " "; //Add to result
}
}
注意:正如 sanit@ 回答所說,您可以更早地終止循環。 請參閱this以了解為什么循環到數字的平方根就足夠了。
上面的答案不足以解決這個問題。 在第二個循環的任何一次運行中,您都想檢查 i 是否輸入了任何 j 的每個 if。 定義一個布爾值,對於每個 i,如果 j 正在划分他,則檢查每個 j 是否(而 j 不是 i 本身)。 如果是這樣,那么什么都不做,繼續運行。否則,將 i 與到目前為止的 res 連接起來,並在最后打印;
boolean flag=true;
for(int i= beg; i<= end; i++)
{
for(int j=2; j<= end; j++)
{
if(i%j== 0 && i!=j)
{
flag=true;
res= i+ " ";
}
}
if(!flag){
res+=i +" ";}
flag=false;
}
return res;
}
private static String Prime(int beg, int end) {
String res = " ";
outer: for (int i = beg; i <= end; i++) {
int upto = (int) Math.sqrt(end);
for (int j = 2; j <= upto; j++) {
if (i != j && i % j == 0) {
continue outer;
}
}
System.out.println(i + " ");
}
return res;
}
我已經使用Math.sqrt
稍微優化了代碼,你仍然可以做更多的優化,只是谷歌如何優化素數生成。
這是一個有效的解決方案:
public static void primeBetween(int beg, int end) {
List<Integer> result = new ArrayList<Integer>();
for (int n = beg; n <= end; n++) {
boolean prime = true;
for (int j = 2; j <= n / 2; j++) {
if (n % j == 0 && n != j) {
prime = false;
}
}
if (prime) {
result.add(n);
}
}
System.out.println(result);
}
/* Driver program */
public static void main(String[] args) {
primeBetween(2, 25);
}
這是輸出: [2, 3, 5, 7, 11, 13, 17, 19, 23]
此方法將打印兩個數字之間的質數
public static void getPrime(int low, int high) {
while (low < high) {
boolean flag = false;
for(int i = 2; i <= low/2; ++i) {
// condition for nonprime number
if(low % i == 0) {
flag = true;
break;
}
}
if (!flag)
System.out.print(low + " ");
++low;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.