平衡三进制(可推广到n进制)

来源:互联网 发布:linux分区方案 知乎 编辑:程序博客网 时间:2024/04/30 09:47

题目:
给定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 Qiandef 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
// javaimport 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);    }}
0 0
原创粉丝点击