Filename: prob58.cc
// Problem 58 // //Starting with 1 and spiralling anticlockwise in the following way, a square spiral with side length 7 is formed. // //37 36 35 34 33 32 31 //38 17 16 15 14 13 30 //39 18 5 4 3 12 29 //40 19 6 1 2 11 28 //41 20 7 8 9 10 27 //42 21 22 23 24 25 26 //43 44 45 46 47 48 49 // // It is interesting to note that the odd squares lie along the bottom right diagonal, but what is more interesting is that 8 out of the 13 numbers lying along both diagonals are prime; that is, a ratio of 8/13 62%. // // If one complete new layer is wrapped around the spiral above, a square spiral with side length 9 will be formed. If this process is continued, what is the side length of the square spiral for which the ratio of primes along both diagonals first falls below 10%? // #include <stdio.h> #include <math.h> static bool isPrime(const unsigned int n) { if(n==2 || n== 3) { return true; } // short cuts to reduce search space if((n-1)%6 != 0 && (n+1)%6 != 0) { return false; } for(unsigned int i=3; i<=ceil(sqrt(n)); i+=2) { if(n%i == 0) { return false; } } return true; } int main() { unsigned int num_primes = 8; unsigned int ne=31; unsigned int ne_inc=26; unsigned int nw=37; unsigned int nw_inc=28; unsigned int sw=43; unsigned int sw_inc=30; unsigned int se=49; unsigned int se_inc=32; unsigned int side_length = 7; while((float)num_primes/(float)((side_length*2)-1) > 0.10) { side_length+=2; ne+=ne_inc; if(isPrime(ne)) ++num_primes; ne_inc+=8; nw+=nw_inc; if(isPrime(nw)) ++num_primes; nw_inc+=8; sw+=sw_inc; if(isPrime(sw)) ++num_primes; sw_inc+=8; se+=se_inc; if(isPrime(se)) ++num_primes; se_inc+=8; // printf("%f\n", (float)num_primes/(float)((side_length*2)-1)); } printf("answer: %d\n", side_length); return 0; }
syntax highlighted by Code2HTML, v. 0.9.1
No comments:
Post a Comment