1≤n≤2^30,输入0结束程序。
最多要称几次一定能把那个假币找出来?
3 12 0
1 3
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()){ int n = sc.nextInt(); if(n == 0) break; int count = 0; while (n >= 2){ //Math.ceil向上取整,但是是double类型 n = (int)Math.ceil((double)n/3); count++; } System.out.println(count); } } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { int n = in.nextInt(); if(n == 0){ return; }else if(n == 1){ System.out.println(0); }else if(n == 2 || n == 3){ System.out.println(1); }else { int count = 1; while(n > 3){ if(n % 3 == 0){ n /= 3; }else{ n = n / 3 +1; } count++; } System.out.println(count); } } } }
对于 1个硬币,称量 0次
对于 2个硬币,称量 1次
对于 3个硬币,称量 1次
对于 4个硬币,称量 2次,先分成(2,2,0),第一次称量前两份(2,2),如果重量不一样,再次求出判断另外2个硬币需要称量的次数。
对于 5个硬币,称量 2次,先分成(2,2,1),第一次称量前两份(2,2),如果重量不一样,再次判断另外1个硬币需要称量的次数。
对于 6个硬币,称量 2次,先分成(2,2,2),第一次称量前两份(2,2),如果重量不一样,再次判断求出另外2个硬币需要称量的次数。
对于 7个硬币,称量 2次,先分成(3,3,1),第一次称量前两份(3,3),如果重量不一样,再次判断求出另外3个硬币需要称量的次数。
通过上面分析可以看出,对于要称量的硬币,每次称量前分成3份,要求前两份的个数不小于第三份。如果前两份重量是一样,那么假币在第三份中,这样就除去了2/3的硬币。
如果前两份重量不一样,那么假币在重量轻的一份中,这样也除去了2/3的硬币。
这样以来,称量一次除去了将近2/3的硬币,一直重复上面的分法,就可以很快求出称量次数。