zoukankan      html  css  js  c++  java
  • 欧拉工程第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是这个数的大小。

  • 相关阅读:
    硬盘安装Win 7系统Windows 7 系统硬盘安装教程(图解)
    修改phpMyAdmin导入SQL文件的大小限制
    金三银四面试季节之Java 核心面试技术点
    2015年校园招聘12家IT公司面试体验
    正则表达式小结
    【译文】NginScript – 为什么我们要实现自己的JS引擎?
    经典算法合集
    【高级JSE技术】线程池
    【高性能服务器】Tomcat剖析
    【高性能服务器】Nginx剖析
  • 原文地址:https://www.cnblogs.com/bbbblog/p/4782227.html
Copyright © 2011-2022 走看看