1. 程式人生 > >華為程式設計題---汽水瓶

華為程式設計題---汽水瓶

有這樣一道智力題:“某商店規定:三個空汽水瓶可以換一瓶汽水。小張手上有十個空汽水瓶,她最多可以換多少瓶汽水喝?”答案是5瓶,方法如下:先用9個空瓶子換3瓶汽水,喝掉3瓶滿的,喝完以後4個空瓶子,用3個再換一瓶,喝掉這瓶滿的,這時候剩2個空瓶子。然後你讓老闆先借給你一瓶汽水,喝掉這瓶滿的,喝完以後用3個空瓶子換一瓶滿的還給老闆。如果小張手上有n個空汽水瓶,最多可以換多少瓶汽水喝?


輸入描述:

輸入檔案最多包含10組測試資料,每個資料佔一行,僅包含一個正整數n(1<=n<=100),表示小張手上的空汽水瓶數。n=0表示輸入結束,你的程式不應當處理這一行。

輸出描述:

對於每組測試資料,輸出一行,表示最多可以喝的汽水瓶數。如果一瓶也喝不到,輸出0。

輸入例子:
3
10
81
0
輸出例子:
1
5
40
思路:方法一:最常規的方法:在給定的數n時,逐步的求解,知道數不能在換汽水的時候。
#include<bits/stdc++.h>
using namespace std;

int solve(int &n, int &result){ 
	if (n <= 1){ 
	   return result; zai 
	} 
	if (n == 2){ 
	   ++result; 
	   return result; 
	} 
	result += n / 3; 
	n = n % 3 + n / 3; 
	solve(n, result); 
}

int main() 
{ 
	int n; 
	while (cin >> n && n != 0) 
	{ 
	   int result=0; 
	   cout << solve(n, result) << endl; 
	} 
    return 0;
}

思路2:這道題看起來比較複雜,三瓶換一瓶,如果只剩下最後兩瓶那麼跟老闆借一瓶喝了變成三個空瓶,最後把贈送的一瓶還給老闆。但是從數學角度來說,開始count = 0;就是如果給定的數是偶數,每次減3加1相當於每次減2,count就要自加1,偶數減2計算到最後肯定是2,也就是偶數瓶汽水最後都是剩下兩瓶實瓶,這樣就可以借一瓶變三個空瓶,還老闆一個實瓶,恰好count==偶數/2;如果開始就是奇數瓶,那麼最後就剩下一瓶實瓶,一瓶實瓶不可以等價的借一瓶變成三個空瓶再還了,所以得浪費,那麼問題又變成:奇數瓶-1=偶數瓶 的問題,又可以利用偶數瓶的方法解決。然而我們都知道,在c++語言中除法運算是向下取整的,即3/2 = 1,因而變相的解決了奇數瓶的問題。所以這道題用了比較取巧的方法,直接瓶數除以2。
程式:
#include<bits/stdc++.h>
using namespace std;
int main()
{    
     int n;
	 while(cin>>n){
	 	cout<<n/2<<endl;
	 } 
     return 0;
 }