• 欧拉工程第62题:Cubic permutations


    题目链接

    找出最小的立方数,它的各位数的排列能够形成五个立方数

     

    解决关键点:

    这五个数的由相同的数组成的

     

    可以用HashMap,Key是由各位数字形成的key,value记录由这几个数组成的立方数出现的次数

     

    Key如何确定?

    1.这个数的每位数排序后,(升序或降序),重新组成的数当作Key

    2.根据该数0-9,出现的次数,组成的字符串当作Key

    Java程序:

    package project61;
    
    import java.util.HashMap;
    
    public class P62{
        long getKey(int[] digits){
    //        这里的映射是改变原来数的顺序
    //        映射后的数低位到高位的数字越来越大
    //        digits数组中的数是原数对应位置出现了几次
    //        可以直接将digits中的数链接起来
            long key = 0;
            for(int i=9;i>=0;i--){
                while(digits[i]!=0){
                    key = key*10+i;
                    digits[i]--;
                }
            }
            return key;    
        }
    
        void run(){
            long a = 0;
            long tempa = 0;
            HashMap<Long, Integer> hm = new HashMap<Long, Integer>();
            for (long i =10000;i>111;i--){
                a = i*i*i;
                tempa = a ;
                int[] b = new int[10];
                long key=0;
                while(a!=0){
                    b[(int) (a%10)] +=1 ;
                    a=a/10;
                }
                key = getKey(b);
                int value = hm.get(key)==null?1:(Integer)hm.get(key)+1;
                if(value==5){
                    System.out.println(tempa);
                }
                hm.put(key, value);
    
            }
            
        }
        String getKey1(int [] digits){
            // 这里只是简单的把从高位到低位链接起来 
            String str="";
            for(int i=9;i>=0;i--)
                str+=digits[i]+"";
            return str;
        }
        void run1(){
            long a = 0;
            long tempa = 0;
            HashMap<String, Integer> hm = new HashMap<String, Integer>();
            long i = 10000;
            while(i>100){
                a = i*i*i;
                tempa = a ;
                int[] b = new int[10];
                String key;
                while(a!=0){
                    b[(int) (a%10)] +=1 ;
                    a=a/10;
                }
                key = getKey1(b);
                int value = hm.get(key)==null?1:(Integer)hm.get(key)+1;
                if(value==5){
                    System.out.println(tempa);
                }
                hm.put(key, value);
                
                i = i - 1;
            }
        }
            
        
        
        public static void main(String[] args)  {    
            long begin= System.currentTimeMillis();
            new P62().run1(); //127035954683
            long end = System.currentTimeMillis();
            long Time = end - begin;
            System.out.println("Time:"+Time/1000+"s"+Time%1000+"ms");
    
            
        }
    }

    上面的程序有个小问题:是以递减的顺序找的值,但是输出来两个结果,小的那个是答案。

     

    Python程序:

    import time as time
    
    clock = time.time()
    
    P = {}
    C = {}
    i = 1
    j = 5
    
    while True:
        c=i*i*i 
        k= ''.join(sorted(str(c)))
        if k in P:
            P[k] +=1 
            if P[k] ==j:
                print C[k]
                break
        else:
            P[k] = 1 
            C[k] =c 
        i = i + 1 
    print('TIME :',time.time() - clock,'seconds')

    上面的Python程序很不错,定义两个字典,一个存放key,以及出现的次数value,一个是用来存放出现的第一个数,key一样,value是这个数的大小。

  • 相关阅读:
    biji001
    公司内部openStack环境信息
    def
    CI调试
    一:Java之面向对象基本概念
    STL_算法_Heap算法(堆排)(精)
    IOS开发-经常使用站点集合
    【iOS开发-47】怎样下载iOS 7.1 Simulator 以及iOS 8离线的Documentation这些文件?
    设计模式简介
    how to deal with &quot;no such file error or diretory&quot; error for a new programmer in QT creator
  • 原文地址:https://www.cnblogs.com/theskulls/p/4782227.html
Copyright © 2020-2023  润新知