簡體   English   中英

無法打印超出第975個素數的數字。 使用eratosthenes篩

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM