问题描述:现有一个天平,只能在天平的一侧放置砝码,输入一个参数N,求最少需要几个砝码才能表示出[1,n]的重量,每个砝码只能用一次。
【解析】二进制的表示问题
数值|权重 | 4 | 2 | 1 |
0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 |
3 | 0 | 1 | 1 |
4 | 1 | 0 | 0 |
5 | 1 | 0 | 1 |
6 | 1 | 1 | 0 |
7 | 1 | 1 | 1 |
如上所示,只用2^0,2^1,2^2就可以表示出[0,2^3-1]之间的数字,数字为1表示需要该权重,数值为0表示不需要该权重。所以可以只用log_2^N取上界个砝码就可以表示[1,N]。
平衡三进制
从左到右,每位的权重为3^1,3^2,3^3,...以此类推,但是每位上的数字从0,1,2变为-1,0,1.所以原来N位数字能表示3^N-1个数字,现在只能表示(3^N-1)/2个数字了。
物理意义:当前位为0表示不加上该位的权重,为1表示加上该位的权重,为0表示减去该位的权重。
例如:1ZZ表示1*(-1)+3*(-1)+9*1=5
问题描述:你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于N的正整数重量,那么这套砝码最少需要包含多少个砝码?注意砝码可以放在天平两边。
【解析】使用平衡三进制,N位平衡三进制数字能表示连续的(3^N-1)/2个数字(正数)
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
int sum = 0;
int i = 0;
while(sum<num) {
i++;
sum = (int)((Math.pow(3,i) - 1)/2);
}
System.out.print(i);
scan.close();
}
}