標簽:com http class blog style code div img java javascript tar
1057: 有假币
時間限制(普通/Java):1000MS/10000MS
運行內存限制:65536KByte
总提交: 2844
測試通過:773
描述
居然有假幣!!!
事情是這樣的,現在豬肉漲了,但是農民的工資卻不見漲啊,沒錢怎麽買豬肉啊。淵子這就去買豬肉,結果找來的零錢中有假幣!!!可惜淵子一不小心把它混進了一堆真幣裏面去了。現在知道假幣的重量比真幣的質量要輕。給你一個天平,請用最快的時間把那個可惡的假幣找出來。
輸入
1≤n≤230,輸入0结束程序。
輸出
最少要稱幾次一定能把那個假幣找出來。
样例輸入
3
12
0
样例輸出
1
3
提示
示例1中共有3枚硬幣,所以任意取2個放天平上稱量一下。
因爲假幣的重量比較輕。
考慮分3堆對該問題最優的特點
做法一:用到了 log 的用法
(int)( log (x) / log (3) )
#include <stdio.h> #include <math.h> int f(int x) { if(1 == x) return 0; else if(2 == x) return 1; else if(3 == x) return 1; else if(x == (pow(3, (int)( log (x) / log (3))))) return (log (x) / log (3)); else return (1 + (int)(log (x) / log (3))); }
做法2 就是让分3堆的数尽量平均
#include <stdio.h> int main() { int n; while(scanf("%d", &n), n != 0) { int count = 0; while(n != 0) { if(1 == n) break; else if(2 == n) { count += 1; break; } else if(3 == n) { count += 1; break; } else { switch(n % 3)//補充至3堆平均,既取原來分堆後最大的一堆 { case 0: n /= 3;break; case 1: n = (n + 2) / 3;break; case 2: n = (n + 1) / 3;break; } count++; } } printf("%d\n", count); } return 0; }
補充一個看到的函數
函数名: ceil
用 法: double ceil(double x);
功 能: 返回大于或者等于指定表达式的最小整数
頭文件:math.h
中文名
ceil
用 法
double ceil
功 能
返回大于等于表達式的最小整數
頭文件
math.h
對第一種解法的簡化
#include<stdio.h> #include<math.h> int main() {
int n; while(scanf("%d",&n),n != 0) printf("%.0lf\n",ceil(log(n)/log(3.0)));//0.1f很重要 return 0; }
標簽:com http class blog style code div img java javascript tar
原文地址:http://www.cnblogs.com/0-happy-0/p/3694558.html