Project Euler: Problem 58 Spiral primes
Starting with 1 and spiralling anticlockwise in the following way, a square spiral with side length 7 is formed.
3736 35 34 33 3231
381716 15 141330
39 1854312 29
40 19 6 1 2 11 28
41 2078 9 10 27
42 21 22 23 24 25 26
4344 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%?
This is an extension of Question 28. You can also find the rule and then judge the prime number.
#include
#include
using namespace std;int cp[100000000];bool isPrime(int n){for (int i = 2; i*i < n; i++){if (n%i == 0)return false;}return true;}void count_prime(unsigned long long n){cp[n] = cp[n - 1];int a[3];a[0] = (2 * n + 1)*(2 * n + 1) - 4 * n;a[1] = (2 * n + 1)*(2 * n + 1) - (2 * n + 1) + 1;a[2] = (2 * n + 1)*(2 * n + 1) - 6 * n;for (int i = 0; i < 3; i++){if (isPrime(a[i]))cp[n]++;}}int main(){memset(cp, 0, sizeof(cp));cp[0] = 0;unsigned long long ans;double a, b, res;for (unsigned long long i = 1; i < 100000000; i++){count_prime(i);a = cp[i] * 1.0;b = (4 * i + 1)*1.0;res = a / b*1.0;cout << res << endl;if (res < 0.10){ans = 2 * i + 1;break;}}cout << ans << endl;system(pause);return 0;}