欧拉工程第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是这个数的大小。

原文地址:https://www.cnblogs.com/theskulls/p/4782227.html