欧拉项目问题58,错误在哪里

时间:2018-09-24 05:18:12

标签: c

我只是看不到代码中的错误,我得到了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

有趣的是,奇数正方形位于右下角的对角线上,但是更有趣的是,沿两个对角线分布的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;
}

1 个答案:

答案 0 :(得分: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;
}