居然有假币!!!
事情是这样的,现在猪肉涨了,但是农民的工资却不见涨啊,没钱怎么买猪肉啊。蒜头君这就去买猪肉,结果找来的零钱中有假币!!!可惜蒜头君一不小心把它混进了一堆真币里面去了。
现在知道假币的重量比真币的质量要轻,所有真币的重量是一样的。
现在包含假币一共有 nn 张纸币,然后有一个天平,蒜头君设计一个找假币的方案。
如果有偶数张纸币,把所有的钱分成两份,用天平称一下,哪边轻假币就在哪边。
如果有奇数张纸币,先随机抽出一张,然后把所有的钱分成两份,用天平称一下,哪边轻假币就在哪边。如果两边一样轻,那么抽出来的就是假币。
按照这样的方案一直找下去,一定能找到假币。
那么最坏情况下,需要使用天平称称多少次。
输入格式
输入一行一个整数 n (1 \le n \le 2^{30})
输出格式
输出一行一个整数,表示最坏情况下使用天平称的次数。
输出时每行末尾的多余空格,不影响答案正确性
样例输入1
3
样例输出1
1
样例输入2
12
样例输出2
3
题意:
在最坏情况下找出假币;
解题思路:
如果有偶数张纸币,把所有的钱分成两份,用天平称一下,哪边轻假币就在哪边。
n=n/2;
ans++;
如果有奇数张纸币,先随机抽出一张,然后把所有的钱分成两份,用天平称一下,哪边轻假币就在哪边。如果两边一样轻,那么抽出来的就是假币。
n=(n-1)/2;
ans++;
假如在最坏情况在奇数张纸币抽出来的就永远不会是假币
Accept Code:
#include <stdio.h>
int main()
{
int n,ans=0;
scanf("%d", &n);
if(n==1)
ans=1;
while(n!=1)
{
if(n%2==0)
n=n/2;
else
n=(n-1)/2;
ans++;
}
printf("%d\n", ans);
return 0;
}