分析:对砝码的放左放右,还是不放,可以最后用1,-1,0表示,类似于二进制的1表示放,0表示不放。
结果变化的时候利用进位的思想。当为2时接一位低位,进一位高位。
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static int n;
public static void main(String[] args) {
Scanner sca = new Scanner(System.in);
n = sca.nextInt();
String three = Integer.toString(n, 3);
//三进制的逆字符串
StringBuilder strBul = new StringBuilder(three);
int ns = strBul.length();
System.out.println(strBul);
//用字符数组存放,以便改变字符
char[] arr = strBul.reverse().toString().toCharArray();
//标记对应砝码是否该放,并且,放到哪边
ArrayList<Integer> al = new ArrayList<>();
for(int i = 0; i < ns; i ++) {
if(arr[i] == '1') {
al.add(0, 1);
}
else if(arr[i] == '2') {
if(i < ns - 1) {
arr[i + 1] += 1;
al.add(0, -1);
}
else {
al.add(0, -1);
al.add(0, 1);
}
}
else {
al.add(0, 0);
}
}
int nl = al.size();
System.out.println("长度: " + nl + '\n' + "结果:");
for(int i = 0; i < nl; i ++) {
if(al.get(i) == 1) {
System.out.println((int)Math.pow(3, nl -i - 1));
}
else if(al.get(i) == -1) {
System.out.println(-(int)Math.pow(3, nl - i - 1));
}
}
}
}
运行结果:
32113
1122001101
长度: 10
结果:
19683
6561
-729
27
9
1