【问题标题】:sieve of eratosthenes java埃拉托色尼筛网 java
【发布时间】:2018-07-21 16:03:04
【问题描述】:

我正在尝试编写一个实现埃拉托色尼筛的程序。我可以从 2 到任何给定的结束编号,但我们正在处理的任务要求我们输入起始值。我完全被卡住了。我尝试了许多不同的代码,但它一直给我奇怪的答案。

我的 start 是起始值,end 是结束值。我基本上想找到这个范围的素数。谢谢!!!

    public static void sieve(int start, int end) {
    int size=(end-start)+1;
    boolean result[]=new boolean[size];
    int prime[]=new int[size];

    for(int i=0; i<size; i++) {
        prime[i]=start+i;
    }


    for(int i=0; i<size; i++) { //every number in result is true
        result[i]=true;
    }

    for(int p=2; p*p <size; p++) {
        if(result[p]==true) {
            for(int i=p*2; i<size; i +=p) {
                result[i]=false;
            }
        }

        for(int i=2; i<size; i++) {
            if(result[i]==true) {
                System.out.print(prime[i] + " ");

            }
        }
    }
}

【问题讨论】:

  • 您正在寻找一个 分段 埃拉托色尼筛。在 Stack Overflow here 上查看我的答案。
  • 使用 Eratosthenes 的 offset 筛子。 (分段筛子可以分段查找它们;但您只需要两个分段,中间可能存在巨大差距,从而节省了同样巨大的时间)

标签: java primes sieve-of-eratosthenes


【解决方案1】:

埃拉托色尼筛法的工作原理是将每个素数的倍数标记为非素数,从第一个素数 2 开始。

因此,即使要求您找到startend 之间的素数,您仍然需要找到2 和end 之间的所有素数。完成后,只需输出请求范围内的素数即可。

【讨论】:

  • 不正确。 足够知道 [2 .. sqrt(end)] 范围内的素数,还可以找到 [start .. end] 范围内的素数。
【解决方案2】:
public class To_find_a_prime_number_using_sieve_of_Eratosthenes { 
    public static void main(String args[]){

        int end_number;
        int arr[];
        arr=new int[100];
        Scanner S=new Scanner(System.in); 
        System.out.println("enter the end number which you want to print he prime number"); 
        end_number=S.nextInt(); 
        //adding natural numbers in the array
        for(int i=0;i<end_number;i++)
        {
            arr[i]=i;
        }
        for(int k=2;k<end_number;k++)
        {

            for(int l=2;l<end_number;l++)
            {
                if(arr[k]*l>end_number)
                { 
                    break; 
                } 
                else {
                    arr[arr[k]*l]=0;
                }

            }

        }

        for(int j=1;j<end_number;j++)
        {
            if(arr[j]!=0 && arr[j]!=1)
            {
                System.out.println(arr[j]); 
            } 
        }
    }
}

【讨论】:

  • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
猜你喜欢
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多