欧拉工程第68题:Magic 5-gon ring

题目链接

任意一条线上的三个数的和都等于9,顺时针,从最小的外圈开始,得到的序列是:432621213

和             序列

9位的字符串;三角环所能形成的最大字符串为432621513。

使用数字1到10,通过不同的安排,可以得到16位或17位的字符串。五角环所能形成的最大的16位的字符串是什么?

16位的字符,10在外圈

17位的字符,10在内圈

求最大的字符串

6,7,8,9,10应该在外圈,1,2,3,4,5在内圈

2*(1+2+3+4+5) +6+7+8+9+10 = 70,每三个数的和是14

下面其实可以手工做出来了

以外圈最小的数开始:6,在1-5找出两个数使得这三个数的和是14只有5,3,最大数,5要在中间

外圈数还剩:7,8,9,10,内圈数还剩:1,2,4.在3所在的线上还差11,只有10+1=11

外圈数还剩:7,8,9,内圈数还剩:2,4.在1所在的线上还差13,只有9+4=11

外圈数还剩:7,8,内圈数还剩:2

下面就是这样的了

答案就是:6531031914842725

下面用Python暴露破解

导入产生排列的包

from itertools import permutations

下面你该知道怎么做了吧

遍历所有的排列,选择满足上面条件的数

全部程序 :

from itertools import permutations

import time as time

def run():
    digits=[‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘10‘]
    perm =  permutations(digits)
    res = 0
    for p in perm:
        arr = map(int,p)
        candidate =      p[0] + p[1] + p[2] +                         p[3] + p[2] + p[4]+                         p[5] + p[4] + p[6]+                         p[7] + p[6] + p[8]+                         p[9] + p[8] + p[1];
    #     print candidate
        if arr[0] > arr[3] or arr[0]> arr[5] or arr[0] > arr[7] or arr[0]> arr[9]:continue
        if arr[1]==10 or arr[2]==10 or arr[4]==10 or arr[8] ==10 :continue
        if (arr[0]+arr[1]+arr[2]) != (arr[3] + arr[2] + arr[4]) :continue
        if (arr[0]+arr[1]+arr[2]) != (arr[5] + arr[4] + arr[6]) :continue
        if (arr[0]+arr[1]+arr[2]) != (arr[7] + arr[6] + arr[8]) :continue
        if (arr[0]+arr[1]+arr[2]) != (arr[9] + arr[8] + arr[1]) :continue
        if int(candidate)>res and len(candidate)==16:
            res = int(candidate)
#             print res ,arr

    print res

if __name__ == ‘__main__‘:
    start = time.time()
    run()
    print "running time:",(time.time() - start),‘s‘

结果

6531031914842725
running time: 30.3180000782 s

这个时间真是太长了。

package project61;

public class P68{
    int[] p = {1,2,3,4,5,6,7,8,9,10};
    void run(){
        for(int i=1;i<20;i++){
            GetNextPerm();
            System.out.println(""+p[0]+p[1]+p[2]+p[3]+p[4]+p[5]+p[6]+p[7]+p[8]+p[9]);
        }

        String result="";
        while(true){
            if(!GetNextPerm()) break;
            if(CheckResult()){
                String candidate ="" + p[0] + p[1] + p[2]
                                + p[3] + p[2] + p[4]
                                + p[5] + p[4] + p[6]
                                + p[7] + p[6] + p[8]
                                + p[9] + p[8] + p[1];
                System.out.println(candidate);
            }
        }

    }
    // 类似于快速排序
    boolean GetNextPerm(){
        int N = p.length;
        int i= N -1;
        while(p[i-1]>=p[i]){
            i--;
            if(i<1) return false;
        }
        int j = N;
        while(p[j-1]<=p[i-1]){
            j = j-1;
        }
        swap(i-1,j-1);
        i++;
        j=N;
        while(i<j){
            swap(i-1,j-1);
            i++;
            j--;
        }

        return true;

    }
    boolean CheckResult(){
        if(p[1]==10||
           p[2]==10||
           p[4]==10||
           p[8]==10) return false;
        if(p[0] > p[3]||
           p[0] > p[5]||
           p[0] > p[7]||
           p[0] > p[9]) return false;
        if(p[0] + p[1]+ p[2] != p[3] + p[2] +p[4]) return false;
        if(p[0] + p[1]+ p[2] != p[5] + p[4] +p[6]) return false;
        if(p[0] + p[1]+ p[2] != p[7] + p[6] +p[8]) return false;
        if(p[0] + p[1]+ p[2] != p[9] + p[8] +p[1]) return false;
        return true;
    }
    void swap(int i,int j){
        int k=p[i];
        p[i] = p[j];
        p[j] = k;
    }
    public static void main(String[] args){
        long t0 = System.currentTimeMillis();
        new P68().run();
        long t1 = System.currentTimeMillis();
        System.out.println("running time:"+(t1 - t0)+"ms");
    }
}

这个自己参数所以的排列,再找满足条件的数

程序跑的倒是很快

6531031914842725
running time:77ms

参考链接

时间: 2024-10-30 01:01:04

欧拉工程第68题:Magic 5-gon ring的相关文章

欧拉工程第70题:Totient permutation

题目链接 和上面几题差不多的 Euler's Totient function, φ(n) [sometimes called the phi function]:小于等于n的数并且和n是互质的数的个数 存在这样的数:N的欧拉数φ(n),是N的一个排列 例如:φ(87109)=79180 求在1---10^7中n/φ(n) 取到最小的 n 是多少? 这里的是p是n的素因子,当素因子有相同的时候只取一个 任意一个正整数都能分解成若干个素数乘积的形式 直接利用上题的phi函数就可以求解 这个是跑的最

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

By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23. 37 42 4 68 5 9 3 That is, 3 + 7 + 4 + 9 = 23. Find the maximum total from top to bottom in triangle.txt (right c

欧拉工程第66题:Diophantine equation

题目链接 脑补知识:佩尔方差 上面说的貌似很明白,最小的i,对应最小的解 然而我理解成,一个循环的解了,然后就是搞不对,后来,仔细看+手工推导发现了问题.i从0开始变量,知道第一个满足等式的解就是最小解. 问题转化为求根号n的连分数问题,分子就是x,分母就是y 要求的分子,分母,问题又转化为:根号n的连分数表示,对,求出其连分数表示就OK了 先求出a的序列是什么? 第64题,就是求a的序列的. a求出来了,要求出分子分母的表达式. 第65题,就是已经知道了a的序列,求分子,当然也可以求分母的 分

欧拉工程第65题:Convergents of e

题目链接 现在做这个题目真是千万只草泥马在心中路过 这个与上面一题差不多 这个题目是求e的第100个分数表达式中分子的各位数之和 What is most surprising is that the important mathematical constant,e = [2; 1,2,1, 1,4,1, 1,6,1 , ... , 1,2k,1, ...]. The first ten terms in the sequence of convergents for e are: 2, 3,

欧拉工程第71题:Ordered fractions

题目链接:https://projecteuler.net/problem=71 If n<d and HCF(n,d)=1, it is called a reduced proper fraction. n/d 真分数升序排序后,离 3/7最近的数,d<=1000000 Java程序: public class P71{ void run(){ calculate(); } void calculate(){ int max_n = 1000000; long a = 3; long b

欧拉工程第73题:Counting fractions in a range

题目链接:https://projecteuler.net/problem=73 n/d的真分数 ,当d<=12000时 在 1/3 and 1/2 之间的有多少个 public class P73{ void run(){ FareySequences(); } void FareySequences(){ int limit = 12000; int a = 1; int b = 3; int c = 4000; int d = 11999; int count=0; while(!(c==

欧拉工程第51题:Prime digit replacements

题目链接 题目: 通过置换*3的第一位得到的9个数中,有六个是质数:13,23,43,53,73和83. 通过用同样的数字置换56**3的第三位和第四位,这个五位数是第一个能够得到七个质数的数字,得到的质数是:56003, 56113, 56333, 56443, 56663, 56773, 和 56993.因此其中最小的56003就是具有这个性质的最小的质数. 找出最小的质数,通过用同样的数字置换其中的一部分(不一定是相邻的部分),能够得到八个质数. 解题思想: 这个题目是很难的 你首先要找到

欧拉工程第52题:Permuted multiples

题目链接 题目: 125874和它的二倍,251748, 包含着同样的数字,只是顺序不同. 找出最小的正整数x,使得 2x, 3x, 4x, 5x, 和6x都包含同样的数字. 这个题目相对比较简单 暴力遍历 判断x,2x,3x,4x,5x,6x是否包含的数字相同 如何判断两个数包含的数字相同? 1. 两个数字转换成字符串后:d1,d2 定义两个集合ts1,ts2, 将d1,d2的各位数都添加到集合ts1中 将d1的各位数添加到集合ts2中 最后这个两个集合相等,则,这个两个数包含相同的数字 2.

欧拉工程第63题:Powerful digit counts

题目链接 这个题目有点坑: 先说自己的思路<虽然走不通> 根据题意可知道: a的b次方 除以 最小的b位数(如:10,100,1000) 的商 在 1--9之间,则:a的b次方就是符合题意的 然后就根据这个遍历 先找到第一个数符合条件的数firstnum 再找到第一个符合条件之后的第一个不满足条件的数nextnum 则:这中间有 nextnum - firstnum个数 当b也就是次方数大于18的时候,Long都溢出了 此时:有38个数