Java 寻找10001:st素数(Euler项目)
我正在做Euler项目的挑战7,它要求我找到10001:st素数 我的尝试如下:Java 寻找10001:st素数(Euler项目),java,Java,我正在做Euler项目的挑战7,它要求我找到10001:st素数 我的尝试如下: int i=2; //the number to check if prime int c=0; //the amount of prime numbers while(true){ //checks if i%n == 0, if so, i is not a prime number. for(int n=2;n<=prob.getMax(i)
int i=2; //the number to check if prime
int c=0; //the amount of prime numbers
while(true){
//checks if i%n == 0, if so, i is not a prime number.
for(int n=2;n<=prob.getMax(i);n++){
//it is not a prime number
if(i%n==0){
break;
}
//it is a prime number
if(n==prob.getMax(i)){
c++;
break;
}
}
i++;
//if c == 10001 we have found the 10001:st prime number
if(c==10001){
System.out.println(i);
break;
}
}
}
public int getMax(int x){
return (int) Math.ceil(Math.sqrt(x));
}
inti=2//检查素数是否为的数字
int c=0//质数的数量
while(true){
//检查i%n==0,如果是,则i不是质数。
对于(int n=2;n在检查找到的素数是否为第10001个素数之前增加i。通过交换这些操作的顺序,它应该可以工作。在显示结果之前增加i
(使用i++
)。100001个素数可能是104760-1
一个建议是,尽量避免这些(正确)。你可以做如下事情:
c = 0;
while (c < 10001) {
....
c++
}
c=0;
而(c<10001){
....
C++
}
在代码中,您没有检查for循环中的prob.getMax(i)
。
在for
循环的主体中添加另一个检查,如下所示:
if(n==theDesiredNumber){
//...
break;
}
通过搜索,您可以发现10001素数是104743。
我将您的算法更改为:
public static void main(String... args) {
int i = 2; //the number to check if prime
int c = 1; //the counter for prime numbers have found so far
while (true) {
if(isPrime(i)){
c++;
}
//if c == 10001 we have found the 10001:st prime number
if (c == 10001) {
System.out.println(i);
break;
}
i++;
}
}
public static boolean isPrime(int number) {
for (int i = 2; i <= getMax(number); i++) {
if (number % i == 0)
return false;
}
return true;
}
public static int getMax(int x) {
return (int) Math.ceil(Math.sqrt(x));
}
publicstaticvoidmain(字符串…参数){
int i=2;//检查素数是否为的数字
int c=1;//到目前为止已找到素数计数器
while(true){
如果(i){
C++;
}
//如果c==10001,我们找到了10001:st素数
如果(c==10001){
系统输出打印LN(i);
打破
}
i++;
}
}
公共静态布尔值iPrime(整数){
对于(inti=2;i素数,需要注意的一点是,除了数字2之外,它们总是奇数,你不必检查这个数字是否可以被它前面的每个数字整除
public class StackOverflow {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// Starting at 1 cause I'm already including 2
long primeCount = 1;
// Start with an odd number cause primes are never even
long prime = 1;
Calendar start = Calendar.getInstance();
while (primeCount < 10001) {
prime += 2;
if (isPrime(prime)) {
primeCount++;
}
}
System.out.println(prime);
System.out.println(String.format("Elapsed Time: %d ms", Calendar.getInstance().getTimeInMillis() - start.getTimeInMillis()));
}
private static boolean isPrime(long prime) {
if (prime <= 1)
return false;
else if (prime % 2 == 0)
return (prime == 2);
else
{
int divisor = 3;
double upperLimit = Math.sqrt((double)prime) + 1;
while (divisor <= upperLimit)
{
if (prime % divisor == 0)
return false;
// Skip by two cause an odd number is never evenly divisible by an even number
divisor +=2;
}
return true;
}
}
}
公共类堆栈溢出{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
//从1开始,因为我已经包括2
长素数=1;
//从奇数开始,因为素数从来都不是偶数
长素数=1;
日历开始=Calendar.getInstance();
而(素数<10001){
素数+=2;
if(isPrime(prime)){
primeCount++;
}
}
System.out.println(prime);
System.out.println(String.format(“运行时间:%d毫秒”,Calendar.getInstance().getTimeInMillis()-start.getTimeInMillis());
}
私有静态布尔iPrime(长素数){
如果(素数项目Euler更多的是关于数学而不是编程。蛮力几乎从来都不是Euler的答案。@Boristespider好的,我明白了。但是我该如何找到这个问题的数学解决方案?这通常是涉及编程的问题通过数字测试来解决的吗?素数通常是使用。不确定你告诉我什么a由第二部分开始。谢谢!它没有立即起作用,但当我像你说的那样切换顺序并在开始时设置c=1时,它起作用了。我不明白为什么在找到素数之前c!=0。对于I=2,检查I是否为素数的For循环是空的,因此2不能被识别为素数。这不应该起作用对于3,也是如此,因此在开始时,偶数c应设置为2。