题目描述
居然有假币!!! 事情是这样的,现在猪肉涨了,但是农民的工资却不见涨啊,没钱怎么买猪肉啊。老王这就去买猪肉,结果找来的零钱中有假币!!!可惜老王一不小心把它混进了一堆真币里面去了。现在知道假币的重量比真币的质量要轻。给你一个天平,请用最快的时间把那个可恶的假币找出来。
输入
输入有多行,每一行的值为硬币的数目n
,1≤n≤230
,输入0
结束程序
输出
最少要称多少次一定能把那个假币找出来。输出对应输入行数。
样例输入
3
12
0
样例输出
1
3
题解
题意很好理解,重要的是思路。看完题的第一想法是让n不断除以2知道等于1为止,但是如果当n过大时误差也会放大,所以行不通。再想到把n无限的分成三份,比较其中两份就能找到假币那一堆,直到每堆只有一个硬币为止。于是就比较3的几次方大于等于n即可。看了看大佬们的题解可以使用pow()函数循环比较更简洁。使用pow函数之前要先添加一个头文件#include<cmath>。代码实现如下:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,num;
while(1)
{
cin>>n;
if(n==0)
break;
for (int i=1;i<=n;i++)
if (pow(3,i)>=n){num=i;break;}
cout<<num<<endl;
}
return 0;
}
pow()函数需传入两个参数,前者是底数后者是指数,即pow(底数,指数)。底数可以是整型也可以是浮点型。