[英]unable to print beyond 975th prime no. using Sieve of eratosthenes
這里的代碼打印我分配給50000個數字的內存的前N個素數,因為我需要第一個5000個素數,即第5000個素數。 是48611。
但是該程序僅打印質數,直到第975個質數為止。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class exp {
private int size;
private boolean[] arr;
public exp(int a){
size = a;
arr = new boolean[size];
}
public void initialize(){
for(int i=2;i<size;++i)
arr[i] = true;
arr[0] = arr[1] = false;
}
public void precompute(){ // this function implements sieve technique
int i=2;
while(i<size){
if(arr[i]){
for(int j=2*i; j<size; j=j+i)
arr[j] = false;
}
i++;
}
}
public String printX(int as){
int counter = 0;
String ans="",b = " ";
for(int i=0; i<size ; ++i){
if(arr[i]){
ans += String.valueOf(i) + b;
counter++;
}
if(counter == as)
break;
}
return ans;
}
public static void main(String[] args) throws NumberFormatException, IOException {
exp e = new exp(50000);
e.initialize();
e.precompute();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
int N;
for(int i=0;i<t;++i){
N = Integer.parseInt(br.readLine());
if(N == 1)
System.out.println("1");
else
System.out.println(e.printX(N));
}
}
}
嘗試打印超過975個素數,從而在日食中出現空白行。 那么,這里的問題是什么? 這個問題與日食有關嗎?
這似乎是Eclipse的局限性。 問題出在Eclipse,而不是代碼。 我已經從命令行運行了您的代碼,它很高興地輸出了5000個素數。 我還可以驗證從Eclipse運行時您的程序是否可以打印975質數,而當要求打印976時可以顯示空白行。我不能說為什么Eclipse打印空白行-也許您一次點擊過Eclipse控制台窗口內部就有一些內部限制您要求它顯示的行太長。
解決此問題的最簡單方法是每printX
生成的字符串中添加換行符。 這樣可以防止行變得太長。 例如,要在每20個質數后添加換行符,請添加行
if (counter % 20 == 0) {
ans += "\n";
}
在counter++
行之后。
順便說一句,在循環中通過串聯(即,使用+
和+=
)構建字符串效率很低。 問題在於,每次以這種方式添加一對字符串時,Java都必須將兩個字符串都復制到一個新字符串中。 作為練習,我建議用StringBuilder代替此方法中的字符串連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.