问题描述
你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意 小于等于 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。
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
package blueMatch; import java.util.ArrayList; import java.util.Scanner; public class 最小砝码 { public static void main(String[] args) { Scanner scan=new Scanner(System.in); int N=scan.nextInt(); ArrayList<Integer> list=new ArrayList<>(); //存储用到的砝码 list.add(1); //1是必选的,如果N==1的话 int sum=1; //存储能加到的最大数 while(N>sum) { //如果最大的数已经超过或等于N的话退出循环 int next=sum+(sum+1); //下一个砝码选取尽量大的 //下一个砝码的值减去当前能表示的最大值等于最大值+1,就能表示最大值的下一个值了 sum=sum+next; //更新最大能表示的值 list.add(next); //将下一个砝码加进集合 } System.out.println(list.size()); //list的大小即为砝码的个数 scan.close(); } }