Project Euler:Problem 61 Cyclical figurate numbers
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.
- The set is cyclic, in that the last two digits of each number is the first two digits of the next number (including the last number with the first).
- Each polygonal type: triangle (P3,127=8128), square (P4,91=8281), and pentagonal (P5,44=2882), is represented by a different number in the set.
- This is the only set of 4-digit numbers with this property.
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;
}
把那个随机生成全排列换成next_permutation也是能搞出来的。
Project Euler:Problem 61 Cyclical figurate numbers的更多相关文章
- Project Euler:Problem 42 Coded triangle numbers
The nth term of the sequence of triangle numbers is given by, tn = ½n(n+1); so the first ten triangl ...
- Project Euler:Problem 55 Lychrel numbers
If we take 47, reverse and add, 47 + 74 = 121, which is palindromic. Not all numbers produce palindr ...
- Project Euler:Problem 88 Product-sum numbers
A natural number, N, that can be written as the sum and product of a given set of at least two natur ...
- Project Euler:Problem 87 Prime power triples
The smallest number expressible as the sum of a prime square, prime cube, and prime fourth power is ...
- Project Euler:Problem 89 Roman numerals
For a number written in Roman numerals to be considered valid there are basic rules which must be fo ...
- Project Euler:Problem 93 Arithmetic expressions
By using each of the digits from the set, {1, 2, 3, 4}, exactly once, and making use of the four ari ...
- Project Euler:Problem 28 Number spiral diagonals
Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is forme ...
- Project Euler:Problem 47 Distinct primes factors
The first two consecutive numbers to have two distinct prime factors are: 14 = 2 × 7 15 = 3 × 5 The ...
- Project Euler:Problem 63 Powerful digit counts
The 5-digit number, 16807=75, is also a fifth power. Similarly, the 9-digit number, 134217728=89, is ...
随机推荐
- 《3+1团队》【Alpha】Scrum meeting 5
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 3+1团队 团队博客地址 https://home.cnblogs.com/u/3-1group ...
- luogu 1968 美元汇率
https://www.luogu.org/problemnew/show/P1968 定义二维数组f[ ][ ],f[i][1]表示在第i天将马克变为美元,f[i][2]表示在第i天将美元变为马克. ...
- 【thinkPHP5实现文件上传】
上传文件 ThinkPHP5.0对文件上传的支持更加简单. 内置的上传只是上传到本地服务器,上传到远程或者第三方平台的话需要自己扩展. 假设表单代码如下: <form action=" ...
- django实现github第三方本地登录
1.安装 pip install social-auth-app-django 2.生成Client ID和Client Secret 3.修改setting.py INSTALLED_APPS = ...
- mysql 常用命令(二)
1.创建数据库,并制定默认的字符集是utf8. CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 COLLATE utf8_g ...
- Oracle中exit,return,continue
记录exit和return的用法 exit用来跳出循环 loop IF V_KBP IS NULL THEN EXIT; END IF; end loop; return跳出 ...
- python的unittest单元测试框架断言整理汇总
自动化脚本最重要的是断言,正确设置断言以后才能帮助我们判断测试用例执行结果. 一.先说说unittest常用的断言吧 常用的就以下几个,网上一搜一大堆.python版本2.7以上都可以调用了. 断言语 ...
- Leetcode 260.只出现一次的数字III
只出现一次的数字III 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素. 示例 : 输入: [1,2,1,3,2,5] 输出: [3,5 ...
- Error:Uninitialized object exists on backward branch 70 Exception Details:
网上下载了一个demo,编译出现如下错误: Gradle sync failed: Uninitialized object exists on backward branch 70 Exceptio ...
- C++,C程序设计入门——《高质量程序设计第4章》
1. 连接规范 1. extern “C” 2. 一部分采用C的连接规范 #ifdef __cplusplus extern "C" { #endif #ifdef __cplus ...