我正在对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);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));
}
我返回值104760,但这似乎不正确。我无法理解我做错了什么,因为我似乎得到了合理的价值。有人能指出我正确的方向吗?
还有:有没有更好的方法来计算这类问题?我似乎正在使用for-loop和暴力强迫我解决每个问题的解决方案。
答案 0 :(得分:2)
在检查找到的素数是否是第10001个之前增加i。通过交换这些操作的顺序,它应该可以工作。
答案 1 :(得分:0)
在显示结果之前,您正在增加i
(使用i++
)。 100001素数可能是104760-1。
一个建议,尽量避免这些(真实)。你可以这样做:
c = 0;
while (c < 10001) {
....
c++
}
答案 2 :(得分:0)
在您的代码中,您没有检查for循环中的prob.getMax(i)
。
在for
循环的正文中添加另一个检查,如下所示:
if(n==theDesiredNumber){
//...
break;
}
答案 3 :(得分:0)
通过搜索,您可以发现第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));
}
答案 4 :(得分:0)
素数的一个注意事项是,除了数字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;
}
}
}
结果(!!!! SPOILER ALERT !!!!!)