Project Euler:Problem 58 Spiral primes
2017-06-18 10:24
316 查看
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%?
这题是28题的一个扩展,相同找规律,然后推断质数即可了
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%?
这题是28题的一个扩展,相同找规律,然后推断质数即可了
#include <iostream> #include <string> 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 = 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 ++; } } 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; }
相关文章推荐
- Project Euler:Problem 58 Spiral primes
- 【Project Euler】【Problem 10】Summation of primes
- [Project Euler] Problem 58
- Project Euler:Problem 47 Distinct primes factors
- Project Euler:Problem 47 Distinct primes factors
- Project Euler:Problem 28 Number spiral diagonals
- projecteuler之58题Spiral primes
- Project Euler:Problem 28 Number spiral diagonals
- Project Euler problem 58
- java 求无限循环小数的循环体/循环部分 project euler problem26
- Project Euler__problem 6
- HDU 5104 Primes Problem(素数打表)
- project euler 10 Summation of primes
- [Project Euler] Problem 18
- hdoj--5104--Primes Problem(素数打表)
- Project Euler: Problem 9 Special Pythagorean triplet
- Project Euler - Problem 5
- Project Euler – Problem 21
- [Project Euler] Problem 49
- [Project Euler] Problem 51