我一直在尝试重新编码,尤其是在C语言中。因此,我已经使用Project Euler提出了项目构想,并采用了关于10001st prime的构想。但是,当我运行下面的代码时,它返回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;
}

最佳答案

您的问题更多是关于解决问题,然后再用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。显然,上面的代码没有经过优化。

我从欧拉7号项目中学到的一些知识-


如果希望遇到大量数字,建议您使用无符号64位整数以避免整数溢出。
上面的算法虽然正确,但效率不是很高,并且将需要很长时间才能运行。您可能希望使用它来查找前20个左右的素数,以验证它是否有效(然后寻找优化)。
当我解决它时,我使用了质数等于或小于六或大于六的倍数(不包括2和3)的事实。有关此陈述的证明,请参见this link

关于c - 为什么我的质数生成函数生成一堆零?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34937915/

10-11 04:10