1. 程式人生 > >CSU1318 Small change 【思維】&&【找規律】

CSU1318 Small change 【思維】&&【找規律】

打完網賽,就到了晚飯的時間,但CSU_ACM的同學們都已經沒力氣出去了,這時CX建議大夥一起點餐吧,因為正是飯點,CX為了不讓大家等太久,找了一個承諾20分鐘送到超時要打折的外賣。但CX的RP都在網賽上用光了,果然送餐的遲到了,按規定咱們是要少給錢的。可是那些送餐員十分的狡猾,他們沒有帶零錢,於是乎,原價為N元的飯,由於他們的遲到可能需要降價,這些狡猾的送餐員會隨機報一個數∈(1,N),如果CSU_ACM的小基友沒有恰好這麼多錢的話,送餐員還是按原價收取飯錢。為了CSU_ACM的最大利益,想知道最少由多少張鈔票可以應對送餐員的任意要求(每張鈔票的價值可為任意正整數),不論送餐員報的數字為多少總能給出相應的零錢。

Input

多組資料(不超過20組),輸入到檔案結束。

輸入為CSU_ACM的小基友們點餐的總價N.(1<=N<=100000)

Output

輸出為CSU_ACM的小基友們準備的零錢的最少張數。每個測試資料一行。

Sample Input
1
2
5
Sample 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;
}