找出最小的立方数,它的各位数的排列能够形成五个立方数
解决关键点:
这五个数的由相同的数组成的
可以用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是这个数的大小。