- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以我尝试用 Java 实现埃拉托色尼分段筛法,这是我能做的最好的。当我运行它时,它没有给出任何错误,但它没有返回任何东西,尽管我在末尾添加了“System.out.println”以打印出所有剩余的素数。提前感谢您的建议
public class SegmentedSieveofEratosthenes {
public static void main(String[] args) throws java.lang.Exception {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
boolean[] v = new boolean[1000000];
int[] primes = new int[1000000];
//counter for the primes vector
int counter = 0;
for(int i=2;i<=(int)Math.sqrt(m);i++)
{
v[i]=true;
}
for(int i=2;i<=(int)Math.sqrt(m);i++)
{
if(v[i]=true)
{
primes[counter]=i;
counter=counter+1;
for(int j=i+1;j<=(int)Math.sqrt(m);j++)
{
if(j%i==0)
{
v[j]=false;
}
}
}
}
boolean[] flags = new boolean[1000000];
for(int i=n;i<=m;i++)
{
flags[i]=true;
}
for(int i=0;i<counter;i++)
{
int start = (n/primes[i])*3;
for(int j=start+i;j<=m;j=j+i)
flags[j]=false;
}
for(int i=n;i<=m;i++)
if(flags[i]==true)
System.out.println(i);
in.close();
}
}
最佳答案
您的实现存在三个明显的问题。第一个问题是您在条件中将 v[i]
分配给 true
if(v[i]=true)
然后在for循环的终止条件中出现了一些差一错误,特别是
for (...; i<=m; ...)
代替
for (...; i<m; ...)
最后,您的数学计算出了以下问题
int start = (n/primes[i])*3;
for(int j=start+i;j<=m;j=j+i)
flags[j]=false;
我确定这是一个小修复,但我想不出来所以我自己写了
int start = n + (-n % primes[i]);
for(int j=start;j<m;j+=primes[i])
flags[j]=false;
此外,我对您的筛子做了一些小改动以加快速度。我没有检查素数模数后的每个数字,而是从 prime^2
开始(其中 ^
表示求幂)并递增 prime
,只标记倍数,没有浪费支票。
原创
primes[counter]=i;
counter=counter+1;
for(int j=i+1;j<=(int)Math.sqrt(m);j++)
{
if(j%i==0)
{
v[j]=false;
}
}
优化
primes[counter++]=i;
for(int j=i*i;j<=(int)Math.sqrt(m);j+=i)
{
v[j]=false;
}
放在一起-
import java.util.Scanner;
import java.util.Arrays;
public class SegmentedSieveofEratosthenes {
public static void main(String[] args) throws java.lang.Exception {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
boolean[] v = new boolean[1000000];
int[] primes = new int[1000000];
//counter for the primes vector
int counter = 0;
for(int i=2;i<=(int)Math.sqrt(m);i++)
{
v[i]=true;
}
for(int i=2;i<=(int)Math.sqrt(m);i++)
{
if(v[i])
{
primes[counter++]=i;
for(int j=i*i;j<=(int)Math.sqrt(m);j+=i)
{
v[j]=false;
}
}
}
boolean[] flags = new boolean[1000000];
for(int i=n;i<m;i++)
{
flags[i]=true;
}
for(int i=0;i<counter;i++)
{
int start = n + (-n % primes[i]);
for(int j=start;j<m;j+=primes[i])
if (j != primes[i])
flags[j]=false;
}
for(int i=n;i<m;i++)
if(flags[i])
System.out.println(i);
in.close();
}
}
例如 n = 800
和 m == 1000
的输出
809
811
821
823
827
829
839
853
857
859
863
877
881
883
887
907
911
919
929
937
941
947
953
967
971
977
983
991
997
关于java - Eratosthenes 分段筛法 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54066310/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我有实体: @Entity @Table(name = "CARDS") public class Card { @ManyToOne @JoinColumn(name = "PERSON_I
我正在尝试计算二维多边形的表面法线。我正在使用 OpenGL wiki 中的 Newell 方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_S
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我这里有以下 XML: Visa, Mastercard, , , , 0, Discover, American Express siteonly, Buyer Pay
即将发生的 Google 政策变更迫使我们实现一个对话框,以通知欧盟用户有关 Cookie/设备标识符用于广告和分析的情况。我只想向欧盟用户显示此对话框。我不想使用额外的权限(例如 android.p
本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技
我有一个与酒精相关的网站,需要先验证年龄,然后才能让他们进入该网站。我使用 HttpModule 来执行此操作,该模块检查 cookie,如果未设置,我会将它们重定向到验证页面。我验证他们的年龄并存储
在欧盟,我们有一项法律,要求网页请求存储 cookie 的许可。我们大多数人都了解 cookie 并同意它们,但仍然被迫在任何地方明确接受它们。所以我计划编写这个附加组件(ff & chrome),它
以下在 C 和/或 C++ 中是否合法? void fn(); inline void fn() { /*Do something here*/ } 让我担心的是,第一个声明看起来暗示函数将被定义
我是一名优秀的程序员,十分优秀!