程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Project Euler:Problem 58 Spiral primes

Project Euler:Problem 58 Spiral primes

編輯:關於C++

 

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題的一個擴展,同樣找規律,然後判斷質數就行了

 

 

#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;
}
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved