这与Project Euler#7 有关,这是关于找到第10001个素数。
在这段代码中,如果我在第二个for循环中使用k*k<=i
,程序会变得更快,但它会给我第10000个素数作为答案。但是当我使用k<=i
或k<=i/2
时,程序会变慢,但会给出正确的答案。
根据我的逻辑,一个特定的数字可以除以<1-the square root of that number>
范围内的数字。该范围内的任何除数都在<square root - (number/2)>
范围内具有相应的除数。
那么为什么我在这两种方法中得到两个不同的答案呢?
以下是代码:
#include<stdio.h>
int main()
{
int i;
int k;
int x;
int y=0;
for(i=1;i<100000000;i++){
x = 0;
/*finding whether the number has more than 2 divisor(exept 1 and the number itself)*/
for(k=1;k*k<=i;k++){
if(i%k == 0){
x++;
}
}
if(x==2){
y++;
}
if(y == 10001){
printf("\n%d",i);
break;
}
}
printf("\n\n");
return 0;
}
这是另一个:
#include<stdio.h>
int main()
{
int i;
int k;
int x;
int y=0;
for(i=1;i<100000000;i++){
x = 0;
/*finding whether the number has more than 2 divisor(exept 1 and the number itself)*/
for(k=1;k<=i/2;k++){
if(i%k == 0){
x++;
}
}
if(x==1){
y++;
}
if(y == 10001){
printf("\n%d",i);
break;
}
}
printf("\n\n");
return 0;
}
答案 0 :(得分:1)
您应该使用Sieve_of_Eratosthenes代替它,它会更快。
您的第一个代码会将i=1
视为x==1
k=1
,因为k*k <= i
:k=1
,但您的第二个代码不会将其视为素数,因为{ {1}}:k > i/2
。 i/2
是整数除法,将被截断为0
。
答案 1 :(得分:0)
首先,我绝对建议使用Python,因为它运行得更快,并且变量更灵活。
我在Python中使用这个问题的解决方案类似于上面发布的算法,但是由于Python的内联for循环,我在一行中做到了。
def isPrime(n):
""" Determines if a number is prime """
if n==2: return True;
if n<2 or n%2==0: return False;
return not any(n%i==0 for i in range(3,int(sqrt(n))+1,2));
我的C语言不是很流利,但这看起来就像(如果我错了,有人会纠正我的语法):
boolean isPrime(int n) {
if (n==2) return true;
if (n < 2 || n % 2 == 0) return false;
boolean r = true;
for(int i=3;i<((int)sqrt(n))+1;i+=2) {
if (n%i==0) r = false;
}
return r;
}
要找到n th 素数,只需从3开始,然后递增2,直到找到答案为止。