CSU1318 Small change 【思維】&&【找規律】
阿新 • • 發佈:2019-01-01
打完網賽,就到了晚飯的時間,但CSU_ACM的同學們都已經沒力氣出去了,這時CX建議大夥一起點餐吧,因為正是飯點,CX為了不讓大家等太久,找了一個承諾20分鐘送到超時要打折的外賣。但CX的RP都在網賽上用光了,果然送餐的遲到了,按規定咱們是要少給錢的。可是那些送餐員十分的狡猾,他們沒有帶零錢,於是乎,原價為N元的飯,由於他們的遲到可能需要降價,這些狡猾的送餐員會隨機報一個數∈(1,N),如果CSU_ACM的小基友沒有恰好這麼多錢的話,送餐員還是按原價收取飯錢。為了CSU_ACM的最大利益,想知道最少由多少張鈔票可以應對送餐員的任意要求(每張鈔票的價值可為任意正整數),不論送餐員報的數字為多少總能給出相應的零錢。
多組資料(不超過20組),輸入到檔案結束。
輸入為CSU_ACM的小基友們點餐的總價N.(1<=N<=100000)
Output輸出為CSU_ACM的小基友們準備的零錢的最少張數。每個測試資料一行。
Sample Input1 2 5Sample Output
1 2
3
解析:
1 可以由1表示
2 可以由1.2表示
.....
7 可以由1.2.4表示
8 可以在1.2.4的基礎上加一個8,這樣可以表示到15
16 可以在1.2.4.8的基礎上加一個16,這樣可以表示到31
.....
找出規律
程式如下:
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; int main() { double n; //log函式預設型別為double ,預設以e為底 while(scanf("%lf",&n)!=EOF) { printf("%d\n",(int)(log(n)/log(2))+1);//換底 ,轉換成整形 }//找到規律為以2為底n的對數+1 return 0; }