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

题目链接

从三角数开始,循环到八角数,再到三角数,求这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. java 反射的踩的一个坑

    今天工作的时候用到了一个反射.其业务简单描述为:系统启动时将需要定时调用的方法签名保存到数据库中,开启线程定时从数据库中读取对应的方法签名,通过反射生成实例后调用方法.完成一定的定时任务. 写到的方法 ...

  2. MongoDB五种树形结构表示法

    MongoDB五种树形结构表示法 第一种:父链接结构 db.categories.insert( { _id: "MongoDB", parent: "Databases ...

  3. php错误收集

    1.Notice: Undefined offset: 1 in F:\www\my\test.php on line 39,原因offset:接下去的数字是出错的数组下标,一般是超出了数组的取值范围 ...

  4. 2013-07-29 IT 要闻速记快想

    ### ========================= ###传动视暴雪82亿美元赎身,腾讯参与投资 ### ========================= ###帮助企业解决打印&邮 ...

  5. 仿UC天气下拉和微信下拉眼睛头部淡入淡出--第三方开源--PullLayout

    Android-PullLayout是github上的一个第三方开源项目,该项目主页是:https://github.com/BlueMor/Android-PullLayout 原作者项目意图实现类 ...

  6. WPF中的瀑布流布局(TilePanel)控件

    最近在用wpf做一个metro风格的程序,需要用到win8风格的布局容器,只能自己写一个了.效果如下 用法 : <local:TilePanel                          ...

  7. 查看leapmotion的frame信息

    leapmotion的SDK里有个c#实例,很详细,其中的frame类已经把这些封装的很完善了.可惜是控制台的,运行时很难去找那些动作对应的哪些数据.我今天做的就是把它们在窗体控件里分别显示出来,这样 ...

  8. Eclipse 下 opennms 开发环境搭建

    1.eclipse3.5或更高版本,并且使用纯净的java版.下载地址:Eclipse for Java Developers. 2.安装需要的插件.通过Help/Install New Softwa ...

  9. 11G RAC 简单命令

    1.查看集群状态: [root@rac1 ~]# su - grid [grid@rac1 ~]$ crsctl check clusterCRS-4537: Cluster Ready Servic ...

  10. ThinkPHP/Common/extend.php

    <?php // +---------------------------------------------------------------------- // | ThinkPHP [ ...