解题思路:/*
将硬币平均分成三堆:A,B,C,若不能平分,则需保证A,B两堆必须数目相同,且A,B的数量要比C多,
其中AB用于称重比较
对于一次称重,若A == B,则假币在C,若A != B,则,假币在轻的那堆。
然后对假币所在的那堆,继续分三堆处理……
直到找到假币
注意:虽然分两堆,也能找到假币,但显然需要称重的次数要比分三堆的次数多一些,不符合题目要求。
A,B的数量要比C多,是为了保证算法的正确性,比如 N = 8,可分成,2 2 4 或者 3 3 2。
若按照 3 3 2分堆,则总共需要称重2次,若分成2 2 4分堆,则总共需要称重3次,显然不是最优解。
*/
参考代码:#include
long chengzhongcishu(long n);
int main(void){
long n;
while(1){
scanf("%ld",&n);
if(n == 0) break;
else {
printf("%ld\n",chengzhongcishu(n));
}
}
return 0;
}
long chengzhongcishu(long n){
long cishu = 0;
if(n == 1) return 0;
else if(n == 2 || n == 3) return 1;
else {
cishu++;
while(n>3){
if(n % 3 == 0){
n = n/3;
cishu++;
}else {
n = n/3 +1;
cishu++;
}
}
return cishu;
}
}