博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
欧拉工程第61题:Cyclical figurate numbers
阅读量:5879 次
发布时间:2019-06-19

本文共 5088 字,大约阅读时间需要 16 分钟。

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

 

从三角数开始,循环到八角数,再到三角数,求这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
vals; public Set
used; public int suffix; public State(int starting) { this.vals = new ArrayList
(); this.used = new HashSet
(); this.suffix = starting % 100; this.vals.add(starting); this.used.add(Type.OCTAGONAL); } public State(State state, Suffix newval) { this.vals = new ArrayList
(state.vals); this.used = new HashSet
(state.used); this.used.add(newval.type); this.vals.add(state.suffix * 100 + newval.val); this.suffix = newval.val; } } public Map
> prefixmap = new HashMap
>(); public P61() throws Exception { Queue
search = new LinkedList
(); 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
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
()); } prefixmap.get(prefix).add(value); } public static void main(String[] args) throws Exception { new P61(); }}
View Code

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)
View Code

根据dfs写的。。。。。

代码2:

from itertools import permutationsdef trig(n):    return n*(n+1)//2def quad(n):    return n*ndef penta(n):    return n*(3*n-1)//2def hexa(n):    return n*(2*n-1)def hepta(n):    return n*(5*n-3)//2def 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]!='0'] for f in listef]print listenbfor i in range(6):    for x in listenb[i]:        ajout(listedict[i],x//100,x)print listedictliste_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))
View Code

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

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

3.循环的放在一起。

 

转载地址:http://xcdix.baihongyu.com/

你可能感兴趣的文章
MYBATIS
查看>>
详解消息队列的设计与使用
查看>>
iOS 项目优化
查看>>
筛选出sql 查询结果中 不包含某个字符
查看>>
8进制与16进制
查看>>
使用Sqoop从mysql向hdfs或者hive导入数据时出现的一些错误
查看>>
mybatis:Invalid bound statement (not found)
查看>>
电脑中毒的现象
查看>>
django表单操作之django.forms
查看>>
webSocket vnc rfb
查看>>
列表推导式 生成器表达式
查看>>
控制子窗口的高度
查看>>
Linux 防火墙iptables命令详解
查看>>
打造笔记本电脑基地重庆要当全球“老大”
查看>>
处理 Oracle SQL in 超过1000 的解决方案
查看>>
《JAVA与模式》之简单工厂模式
查看>>
Alpha线性混合实现半透明效果
查看>>
chkconfig 系统服务管理
查看>>
一个简单的运算表达式解释器例子
查看>>
ORACLE---Unit04: SQL(高级查询)
查看>>