项目Euler#7:代码中有什么问题吗?

时间:2014-01-04 01:18:57

标签: c

这与Project Euler#7 有关,这是关于找到第10001个素数。

在这段代码中,如果我在第二个for循环中使用k*k<=i,程序会变得更快,但它会给我第10000个素数作为答案。但是当我使用k<=ik<=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;
}

2 个答案:

答案 0 :(得分:1)

您应该使用Sieve_of_Eratosthenes代替它,它会更快。

您的第一个代码会将i=1视为x==1 k=1,因为k*k <= ik=1,但您的第二个代码不会将其视为素数,因为{ {1}}:k > i/2i/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,直到找到答案为止。