试题 G: 最少砝码 java
【问题描述】
你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于 N 的正整数重量。那么这套砝码最少需要包含多少个砝码?注意砝码可以放在天平两边。
【输入格式】
输入包含一个正整数 N。
【输出格式】
输出一个整数代表答案。
【样例输入】
7
【样例输出】
3
【样例说明】
3 个砝码重量是 1、4、6,可以称出 1 至 7 的所有重量。
1 = 1;
2 = 6 − 4 (天平一边放 6,另一边放 4);
3 = 4 − 1;
4 = 4;
5 = 6 − 1;
6 = 6;
7 = 1 + 6;
少于 3 个砝码不可能称出 1 至 7 的所有重量。
【评测用例规模与约定】
对于所有评测用例,1 ≤ N ≤ 1000000000。
注意
- 这里用到了等比序列
- 要逐步找规律和分析
- 砝码1是必选要选的
分析
砝码1是必选要选的
当输入n=1时;砝码选择1;
当输入n=2时;砝码选择1,2;(1,3也可以)
当输入n=3时;砝码选择1,2;(1,3也可以)
当输入n=4时;砝码选择1,3(最少砝码个数);(1+3=4)(1个砝码)
当输入n=5时;选择1,4;无法称重2;选择1,3,4 (2个砝码);1,3,9(也可以行)
当输入n=6时;选择1,3,5(行)1,3,9(也可以行)
当输入n=7时;选择1,3,6(行)1,3,9(也可以行)
当输入n=8时;选择1,3,7(行)1,3,9(也可以行)
当输入n=9时;选择1,3,8(行)1,3,9(也可以行)
当输入n=10时;选择1,3,8(行)1,3,9(也可以行)
当输入n=11时;选择1,3,9(行)
当输入n=12时;选择1,3,9(行)
当输入n=13时;选择1,3,9(行)(1+3+9=13)(最少砝码个数)
当n=13~40, 选择1,3,9,27(4个砝码),1+3+9+27=40;
当n=41~121, 选择1,3,9,27,81(5个砝码),1+3+9+27+81=121;
n | 砝码 |
---|---|
1 | 1 |
2 | 1,2 |
3 | 1,2 |
4 | 1,3 |
5 | 1,3,4 |
6 | 1,3,5 |
7 | 1,3,6 |
8 | 1,3,7 |
9 | 1,3,8 |
10 | 1,3,9 |
11 | 1,3,9 |
12 | 1,3,9 |
13 | 1,3,9 |
n | 1+3+9 +…>=n |
代码
import java.util.Scanner;
public class 最少砝码 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
int n=input.nextInt();//要测试的总重量
int faMa=1;//设砝码起始重量为1;
int count=0;//设砝码个数为0;
while(n>0) {
n-=faMa;//总重减去砝码重量
faMa*=3;//砝码每次增重3倍;
count++;//砝码个数
}
System.out.println(count);
}
}