---恢复内容开始---

题目链接

从三角数开始,循环到八角数,再到三角数,求这6个数的和

这个比较复杂,代码在网上找的

Java:

package project61;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set; public class P61
{
static enum Type {
TRIANGLE, SQUARE, PENTAGONAL, HEXAGONAL, HEPTAGONAL, OCTAGONAL;
} static class Suffix {
public Type type;
public int val; public Suffix(Type type, int val) {
this.type = type;
this.val = val;
}
} static class State {
public List<Integer> vals;
public Set<Type> used;
public int suffix; public State(int starting) {
this.vals = new ArrayList<Integer>();
this.used = new HashSet<Type>();
this.suffix = starting % 100;
this.vals.add(starting);
this.used.add(Type.OCTAGONAL);
} public State(State state, Suffix newval) {
this.vals = new ArrayList<Integer>(state.vals);
this.used = new HashSet<Type>(state.used);
this.used.add(newval.type);
this.vals.add(state.suffix * 100 + newval.val);
this.suffix = newval.val;
}
} public Map<Integer, Set<Suffix>> prefixmap = new HashMap<Integer, Set<Suffix>>(); public P61() throws Exception
{
Queue<State> search = new LinkedList<State>(); int n = 1;
boolean bounds = true;
while (bounds) {
int tri = n * (n + 1) / 2;
int sq = n * n;
int pent = n * (3 * n - 1) / 2;
int hex = n * (2 * n - 1);
int hept = n * (5 * n - 3) / 2;
int oct = n * (3 * n - 2); if (tri < 10000 && tri >= 1000)
addPrefix(tri / 100, new Suffix(Type.TRIANGLE, tri % 100));
if (sq < 10000 && sq >= 1000)
addPrefix(sq / 100, new Suffix(Type.SQUARE, sq % 100));
if (pent < 10000 && pent >= 1000)
addPrefix(pent / 100, new Suffix(Type.PENTAGONAL, pent % 100));
if (hex < 10000 && hex >= 1000)
addPrefix(hex / 100, new Suffix(Type.HEXAGONAL, hex % 100));
if (hept < 10000 && hept >= 1000)
addPrefix(hept / 100, new Suffix(Type.HEPTAGONAL, hept % 100));
if (oct < 10000 && oct >= 1000)
search.add(new State(oct)); bounds &= (tri < 10000);
n++;
} while (search.size() > 0) {
State cur = search.poll();
// System.out.println(cur);
if (cur.vals.size() == 6 && cur.used.size() == 6 &&
(cur.vals.get(0) / 100 == cur.vals.get(5) % 100)) {
int sum = 0;
for (int val : cur.vals) {
System.out.println(val);
sum += val;
}
System.out.println();
System.out.println(sum);
} else {
Set<Suffix> candidates = prefixmap.get(cur.suffix);
if (candidates != null) {
for (Suffix suff : candidates) {
if (!cur.used.contains(suff.type)) {
State newstate = new State(cur, suff);
search.add(newstate);
}
}
}
}
}
} public void addPrefix(int prefix, Suffix value) {
if (!prefixmap.containsKey(prefix)) {
prefixmap.put(prefix, new HashSet<Suffix>());
}
prefixmap.get(prefix).add(value);
} public static void main(String[] args) throws Exception
{
new P61();
} }

Python:

代码1:

def main(p):

    Tri = lambda n: (n * (n + 1)) / 2
Squ = lambda n: (n * n)
Pen = lambda n: (n * (3 * n - 1)) / 2
Hex = lambda n: (n * (2 * n - 1))
Hep = lambda n: (n * (5 * n - 3)) / 2
Oct = lambda n: (n * (3 * n - 2))
a = [[Tri, Squ, Pen, Hex, Hep, Oct][i] for i in p]
S = [] for fun in a:
S.append([[str(fun(i))]
for i in range(1000) if len(str(fun(i))) == 4]) ans = [S[0][:]]
for t in S[1:]:
ans.append([])
for j in ans[-2]:
for i in t:
if j[-1][2:] == i[0][:2]:
ans[-1].append(j + i)
for i in ans[5]:
if i[0][:2] == i[-1][2:]:
print sum(map(int,i)) def dfs(p, l):
r = len(p)
if l == r:
main(p)
else:
for i in range(l, r):
p[l] ,p[i] = p[i], p[l]
dfs(p, l + 1)
p[l] ,p[i] = p[i], p[l] p = [0,1,2,3,4,5]
dfs(p, 1)

根据dfs写的。。。。。

代码2:

from itertools import permutations

def trig(n):
return n*(n+1)//2 def quad(n):
return n*n def penta(n):
return n*(3*n-1)//2 def hexa(n):
return n*(2*n-1) def hepta(n):
return n*(5*n-3)//2 def octo(n):
return n*(3*n-2) def ajout(d,k,x):
try:
d[k].append(x)
except:
d[k]=[x] listef=[trig,quad,penta,hexa,hepta,octo] listedict=[dict() for i in range(6)] listenb=[[f(n) for n in range(150) if f(n)>=1000 and f(n)<=9999 and str(f(n))[-2]!=''] for f in listef] print listenb for i in range(6):
for x in listenb[i]:
ajout(listedict[i],x//100,x) print listedict liste_possibilites=[] for p in permutations([0,1,2,3,4]):
for x in listenb[-1]:
chaines=[[x]]
for i in range(5):
chaines2=[]
for c in chaines:
try:
nb=c[-1]
listecontinuation=listedict[p[i]][nb%100]
for y in listecontinuation:
chaines2.append(c+[y])
except:
continue
chaines=chaines2
liste_possibilites+=chaines print liste_possibilites solutions=[x for x in liste_possibilites if x[-1]%100==x[0]//100] solution=solutions[0] print(sum(solution))

1.求出所以的三角数到八角数

2.前两位相同的放在一起

3.循环的放在一起。

欧拉工程第61题:Cyclical figurate numbers的更多相关文章

  1. 欧拉工程第55题:Lychrel numbers

    package projecteuler51to60; import java.math.BigInteger; import java.util.Iterator; import java.util ...

  2. 欧拉工程第69题:Totient maximum

    题目链接 欧拉函数φ(n)(有时也叫做phi函数)可以用来计算小于n 的数字中与n互质的数字的个数. 当n小于1,000,000时候,n/φ(n)最大值时候的n. 欧拉函数维基百科链接 这里的是p是n ...

  3. 欧拉工程第70题:Totient permutation

    题目链接 和上面几题差不多的 Euler's Totient function, φ(n) [sometimes called the phi function]:小于等于n的数并且和n是互质的数的个 ...

  4. 欧拉工程第67题:Maximum path sum II

    By starting at the top of the triangle below and moving to adjacent numbers on the row below, the ma ...

  5. 欧拉工程第66题:Diophantine equation

    题目链接 脑补知识:佩尔方差 上面说的貌似很明白,最小的i,对应最小的解 然而我理解成,一个循环的解了,然后就是搞不对,后来,仔细看+手工推导发现了问题.i从0开始变量,知道第一个满足等式的解就是最小 ...

  6. 欧拉工程第65题:Convergents of e

    题目链接 现在做这个题目真是千万只草泥马在心中路过 这个与上面一题差不多 这个题目是求e的第100个分数表达式中分子的各位数之和 What is most surprising is that the ...

  7. 欧拉工程第56题:Powerful digit sum

    题目链接   Java程序 package projecteuler51to60; import java.math.BigInteger; import java.util.Iterator; im ...

  8. 欧拉工程第54题:Poker hands

    package projecteuler51to60; import java.awt.peer.SystemTrayPeer; import java.io.BufferedReader; impo ...

  9. 欧拉工程第53题:Combinatoric selections

    package projecteuler51to60; class p53{ void solve1(){ int count=0; int Max=1000000; int[][] table=ne ...

随机推荐

  1. 方便实用的jQuery checkbox复选框全选功能

    // 主复选框 <input type="checkbox" id="ck" name="ckAll">// 子复选框项 < ...

  2. C#函数运行超时则终止执行(任意参数类型及参数个数通用版)

    /// <summary> /// 控制函数执行时间,超时返回null不继续执行 /// 调用方法 /// FuncTimeout.EventNeedRun action = delega ...

  3. CentOS 6.4 下搭建 MongoDB 2.4.9 环境

    一.下载MongoDB2.4.9版 下载MongoDB wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.9.tgz 解压Mo ...

  4. 重拾C,一天一点点_4_随想

    刚才顺便又把二分默写了一遍,还好,这次比较顺利.算法这一块,一直是自己一块痛处,有时感觉自己的脑瓜子怎么就这么笨,后一想觉得肯定是锈逗了,确实啊,这么长时间不思考的脑子能机灵到哪呢?早就意识到这个问题 ...

  5. 移植Oracle procedure 到 postgresql

    1.登录postgresql psql -h 192.168.137.131 -p 5432 postgres satusc@6789#JKL 2.创建用户 CREATE USER name thun ...

  6. Java从入门到精通——数据库篇之JAVA中的对Oracle数据库操作

    在Java中对Oracle数据库的操作分为两种:一.查询.二.非查询. 下面是我对其进行总结: 一.查询数据 /** * 根据用户代码查询 * @param userId * @return 如果存在 ...

  7. 安装mysql 5.5.14 报错

    提示cmake nod foundyum install cmake 原因是曾经服务器安装过mysql数据库Installing MySQL system tables...101223 14:28: ...

  8. 转载 -- C# 中的委托和事件

    原文地址:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx C# 中的委托和事件 引言 委 ...

  9. DB天气app冲刺二阶段第五天

    昨天什么事情也没做..看了一场哆啦a梦 所以就不算冲刺了.. 今天主要就是做了一下需要用到的图片的整理还有的就是UI主界面需要展示用的素材,发现好多东西都需要搜索半天,虽然这个不是什么技术活..但真的 ...

  10. Struts2结合sitemesh3制作网站母版页面

    上一篇文章介绍了sitemesh3的使用,这篇文章来介绍如何结合struts2来配置和使用sitemesh,具体的如何使用sitemesh3我就不讲解了,这个你们可以看看我的上一篇博客. 首先你要添加 ...