gpt4 book ai didi

c - 欧拉项目第58题,错误在哪里

转载 作者:行者123 更新时间:2023-11-30 16:28:09 25 4
gpt4 key购买 nike

我只是无法看到代码中的错误在哪里,我得到 26249(如果我返回一级螺旋,则为 26247),但它应该是 26241。

显然,我的逻辑肯定有问题,但我又说不出来哪里。

螺旋素数,欧拉计划问题 58

从1开始,按如下方式逆时针旋转,形成边长为7的方形螺旋。

37 36 35 34 33 32 31
38 17 16 15 14 13 30
39 18 05 04 03 12 29
40 19 06 01 02 11 28
41 20 07 08 09 10 27
42 21 22 23 24 25 26
43 44 45 46 47 48 49

有趣的是,奇数方 block 位于右下对角线上,但更有趣的是,沿着两条对角线的 13 个数字中有 8 个是质数;即比例为 8/13 ≈ 62%。

如果在上面的螺旋上再包裹一层完整的新层,就会形成一个边长为9的方形螺旋。如果继续这个过程,那么当两条对角线上的素数比率首先低于 10% 时,方形螺旋的边长是多少?

#include <stdio.h>
#define print(ref) printf(#ref" = %d\n",ref);
#define printl(ref) printf(#ref" = %ld\n",ref);
#define NUM_OF_PRIMES 5000

int primesOnThisLevel(int);

void generatePrimes();
int isPrime(int);
int canBeExpressedAsPrime(int);

int primes[NUM_OF_PRIMES] = {2,3,5};
int primesFound = 3;

int main(){
int numbersInDiagonal = 1;
int primesInDiagonal = 0;
int level;

generatePrimes();

for (level = 2 ; numbersInDiagonal/10 <= primesInDiagonal ; level++){
primesInDiagonal += primesOnThisLevel(level);
numbersInDiagonal += 4;
}

print(numbersInDiagonal)
print(primesInDiagonal)
int sideLenght = (2*level)-1;
print(sideLenght*sideLenght);
print(sideLenght);

return 0;
}

int primesOnThisLevel(int level){
int primesCount = 0;
int sideLenght = (2*level)-1;
int differenceBetweenCorners = 2*(level-1);
int cornerValue = sideLenght*sideLenght;
for (int i = 0 ; i < 3 ; i++){
cornerValue -= differenceBetweenCorners;
primesCount += isPrime(cornerValue);
}
return primesCount;
}

void generatePrimes(){
for (int i = 7 ; primesFound < NUM_OF_PRIMES ; i +=2 ){
if ( isPrime(i) ){
primes[primesFound++] = i;
}
}
print(primes[primesFound-1]);
}

int isPrime(int prospect){
if ( prospect == 3 || prospect == 5 ) return 1;
if ( !canBeExpressedAsPrime(prospect) ) return 0;
for (int i = 0 ; primes[i]*primes[i] <= prospect ; i++)
if ( prospect%primes[i] == 0 ) return 0;
return 1;
}

int canBeExpressedAsPrime(int prospect){
if ( prospect%6 == 1 ) return 1;
if ( prospect%6 == 5 ) return 1;
return 0;
}

最佳答案

特别感谢Roberto Trani指出了关于边界的错误,之前的限制包括10%,这是不应该发生的,这里是修改后的main函数,这是使用do-while的完美情况循环。

int main(){
int numbersInDiagonal = 1;
int primesInDiagonal = 0;
int level = 2;

generatePrimes();

do {
primesInDiagonal += primesOnThisLevel(level);
numbersInDiagonal += 4;
level++;
} while ( numbersInDiagonal < primesInDiagonal*10 );

int sideLenght = (2*(--level))-1;
print(sideLenght);

return 0;
}

关于c - 欧拉项目第58题,错误在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52473030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com