题目:
给定1,3,9,27,81这5个数,求1-121之间的任意一个数字用这5个数表示的方法,大的数字在前。
例如:
输入 19 输出:27-9+1
输入 121 输出 : 81+27+9+3+1
ps.题目是华为机试题,笔者当时由于机试时间所限,采用了打表法,这也算以空间换时间的一种。但方法比较low,回来网上查找了一下,是关于平衡进制的问题。
下面用Python和Java分别实现:
# coding: utf-8
# Python 2.7
# author: Wicle Qian
def translate(n):
# translate to 3-radix
a = []
while n:
a.append(n % 3)
n /= 3
a.append(0) # prepare to next step
# 3-radix translate to balanced 3-radix
# 0,1,2 => 0,1,-1,1, 2*3^n = 3^(n+1)-3^n
for i in range(len(a)-1):
if a[i] == 2:
a[i] = -1
a[i+1] += 1
# output
for i in range(len(a)-1,-1,-1):
print("3^%d: %+d" %(i,a[i]))
while True:
try:
n = int(raw_input())
translate(n)
except:
break
// java
import java.util.ArrayList;
import java.util.Scanner;
public class BalancedThreeRadix{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
translateToThreeRadix(n);
}
sc.close();
}
private static void translateToThreeRadix(int n){
ArrayList<Integer> a = new ArrayList<Integer>();
# translate to 3-radix
while(n != 0){
a.add(n % 3);
n /= 3;
}
a.add(0);
# to balanced-3-radix
for(int i = 0; i < a.size()-1; i++){
if(a.get(i) == 2){
a.set(i,-1);
a.set(i+1,a.get(i+1)+1);
}
}
# output
StringBuilder sb = new StringBuilder();
for(int i = a.size()-1; i >= 0; i--){
if(a.get(i) == 1){
if(sb.length() == 0){
sb.append((int)Math.pow(3,i));
}else{
sb.append("+"+(int)(Math.pow(3,i)));
}
}else if( a.get(i) == 0){
continue;
}else{
sb.continue("-"+(int)(Math.pow(3,i)));
}
}
System.out.println(sb);
}
}