Triangle, square, pentagonal, hexagonal, heptagonal, and octagonal numbers are all figurate (polygonal) numbers and are generated by the following formulae:
| Triangle | P3,n=n(n+1)/2 | 1, 3, 6, 10, 15, ... | ||
| Square | P4,n=n2 | 1, 4, 9, 16, 25, ... | ||
| Pentagonal | P5,n=n(3n?1)/2 | 1, 5, 12, 22, 35, ... | ||
| Hexagonal | P6,n=n(2n?1) | 1, 6, 15, 28, 45, ... | ||
| Heptagonal | P7,n=n(5n?3)/2 | 1, 7, 18, 34, 55, ... | ||
| Octagonal | P8,n=n(3n?2) | 1, 8, 21, 40, 65, ... | 
The ordered set of three 4-digit numbers: 8128, 2882, 8281, has three interesting properties.
Find the sum of the only ordered set of six cyclic 4-digit numbers for which each polygonal type: triangle, square, pentagonal, hexagonal, heptagonal, and octagonal, is represented by a different number in the set.
又暴力破解了一次ㄟ( ▔, ▔ )ㄏ
一开始没看清题意,我以为这些数依次是满足triangle, square, pentagonal, hexagonal, heptagonal, and octagonal,结果发现无解┑( ̄Д  ̄)┍
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <time.h>
using namespace std;
int triangle[100];
int pentagonal[10000];
int hextagonal[10000];
int heptagonal[10000];
int octagonal[10000];
int tri_count = 0;
void getTriangle()
{
	int count = 0;
	for (int i = 1; i <= 200; i++)
	{
		int num = i*(i + 1) / 2;
		if (num >1000&&num<10000)
			triangle[count++] = num;
	}
	tri_count = count;
}
bool isSqure(int n)
{
	int i = sqrt(n);
	if (i*i == n&&n>1000&&n<10000)
		return true;
	return false;
}
void getPentagonal()
{
	for (int i = 1; i <= 200; i++)
	{
		int num = i*(3 * i - 1) / 2;
		if (num > 1000 && num < 10000)
			pentagonal[num] = 1;
	}
}
bool isPentagonal(int n)
{
	if (pentagonal[n] == 1)
		return true;
	return false;
}
void getHexagonal()
{
	for (int i = 1; i <= 200; i++)
	{
		int num = i*(2 * i - 1);
		if (num>1000 && num < 10000)
			hextagonal[num] = 1;
	}
}
bool isHexagonal(int n)
{
	if (hextagonal[n] == 1)
		return true;
	return false;
}
void getHeptagonal()
{
	for (int i = 1; i <= 200; i++)
	{
		int num = i*(5 * i - 3) / 2;
		if (num > 1000 && num < 10000)
			heptagonal[num] = 1;
	}
}
bool isHeptagonal(int n)
{
	if (heptagonal[n] == 1)
		return true;
	return false;
}
void getOctagonal()
{
	for (int i = 1; i <= 200; i++)
	{
		int num = i*(3 * i - 2);
		if (num > 1000 && num < 10000)
			octagonal[num] = 1;
	}
}
bool isOctagonal(int n)
{
	if (octagonal[n] == 1)
		return true;
	return false;
}
bool(*figurate[5])(int) = { isSqure, isPentagonal, isHexagonal, isHeptagonal, isOctagonal };
vector<int> GetRandomSequence() 
{
	unordered_map<int, int>tab;
	vector<int>res;
	int num;
	for (int i = 0; i < 5; i++)
	{
		do{
			num = rand() % 5;
		} while (tab.find(num) != tab.end());
		tab.insert(make_pair(num, 1));
		res.push_back(num);
	}
	return res;
}
int check()
{
	int sum = 0;
	srand((int)time(0));
	vector<int>rs = GetRandomSequence();
	for (int i = 0; i < tri_count; i++)
	{
		int a = triangle[i] / 100;
		int b = triangle[i] % 100;
		for (int s = 10; s <= 99; s++)
		{
			if ((*figurate[rs[0]])(b * 100 + s))
			{
				for (int p = 10; p <= 99; p++)
				{
					if ((*figurate[rs[1]])(s * 100 + p))
					{
						for (int hx = 10; hx <= 99; hx++)
						{
							if ((*figurate[rs[2]])(p * 100 + hx))
							{
								for (int hp = 10; hp <= 99; hp++)
								{
									if ((*figurate[rs[3]])(hx * 100 + hp))
									{
										if ((*figurate[rs[4]])(hp * 100 + a))
										{
											sum = triangle[i] + b * 100 + s + s * 100 + p + p * 100 + hx + hx * 100 + hp + hp * 100 + a;
											return sum;
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
	return -1;
}
int main()
{
	memset(pentagonal, 0, sizeof(pentagonal));
	memset(hextagonal, 0, sizeof(hextagonal));
	memset(heptagonal, 0, sizeof(heptagonal));
	memset(octagonal, 0, sizeof(octagonal));
	
	getTriangle();
	getPentagonal();
	getHexagonal();
	getHeptagonal();
	getOctagonal();
	int flag;
	while (true)
	{
		flag = check();
		if (flag != -1)
			break;
	}
	
	cout << flag << endl;
	
	system("pause");
	return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
Project Euler:Problem 61 Cyclical figurate numbers
原文地址:http://blog.csdn.net/youb11/article/details/46878413