为什么我的素数生成函数会产生一堆零?

时间:2016-01-22 02:19:27

标签: c gcc codeblocks primes

我一直在努力重新编写代码,特别是在C语言中。所以我使用Project Euler作为项目创意,并且我接受了关于第10001个素数的那个。但是,当我运行下面的代码时,它返回2,0,0,0等等。问题是什么?我查看了其他人提出的问题,但我没有找到任何与C语言相同的低级语言。

/*##########################################################
*   The 10,001st Prime
*   Rob Merrell
*   21 January 2016
##########################################################*/

#include <stdio.h>
#include <math.h>

int main() {
    int Int = 2; int PrimeCheck = 2; int Count = 0; int PrimeCount = 0;
    int Primes[10002]; Primes[0] = 0;
    if (Int < PrimeCheck) {
        for (Int = 2; Int < PrimeCheck;PrimeCount < 10001) {
            if (PrimeCheck%Int != 0) {
                Int++;
                continue;
            }
            else {
                PrimeCheck++;
                Int = 2;
                continue;
            }
        }
    }
    else {
        Count++;
        Primes[Count] = PrimeCheck;
        PrimeCount++; PrimeCheck++;
        Int = 2;
    }
    int i = 1;
    for(i = 1; i < 10001; i++) {
        printf("%d ", Primes[i]);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

你的问题更多的是解决问题,然后用C语言(或任何其他语言)进行编程,因为你的问题解决方法是错误的,正如其他人在评论中所指出的那样。这是一种思考这个问题的方法:

所以,如果我要求你手动解决这个问题,你会怎么做?

最有可能的是,你会做类似的事情:

  • (步骤1)选择一个凝视测试编号,比如4(知道2和3是素数)
  • (步骤2)将试验除数设为2
  • (步骤3)如果您的号码可以被试验除数整除,请转到步骤7
  • (步骤4)将你的小除数递增1和步骤3。
  • (步骤5)记下下一个数字,因为它是素数,
  • (步骤6)检查您是否找到了10001个素数,如果是这样的话。
  • (步骤7)将测试编号增加1并转到步骤2

所以,在伪代码中,上面看起来像这样:

primeCnt <- 2
testNum <- 4   

while (primeCnt <= 10001) do
    divisor <- 2
    isComposite <- false 
    while (divisor < testNum)
        if(testNum % divisor == 0)   // we found a factor  
            isComposite <- true
            break
         end if
         divisor <- divisor + 1
    done

    if (!isComposite)     // we found a prime
        primeCnt <- primeCnt + 1
        print  testNum
    end if

    testNum <- testNum + 1

done 

你应该可以将上面的伪代码翻译成C.显然,上面的代码没有优化。

关于Project Euler#7的一些事情 -

  1. 期望遇到大数字,建议您使用无符号的64位整数来避免整数溢出。
  2. 上述算法,虽然正确不是很有效,但需要很长时间才能运行。您可能希望使用它来查找前20个左右的素数以验证它是否有效(然后查找优化)。
  3. 当我解决它时,我使用了这样一个事实:素数要么小于1,要么大于6的倍数(不包括2和3)。有关此声明的证明,请参阅this link