碰到过的一道笔试题:晓明手上有n个空瓶子,每3个空瓶子可以兑换1瓶新饮料。问晓明可以喝到多少瓶饮料。
思路:一看题目中没有涉及任何数据结构和算法的内容。这是一道数学题,缕清数学关系就可以了。
(1)3个空瓶子可以兑换1瓶新饮料,那么现有的瓶子n要减去3,即n-3;
(2)兑换之后又得回1个新瓶子,即每次兑换之后,手上又多了1个瓶子,即(n-3)+1;------------> 即 n - 2
(3)每次成功兑换之后,晓明就喝到1瓶新饮料。所以只要兑换成功1次,喝的饮料瓶数+1就可以。
(4)什么时候兑换不成功?兑换之前手上只剩下1个或者2个空瓶子时,兑换不成功,喝到0瓶。
以下为解法:
#include <iostream>
using namespace std;
int nums(int n){
if(n == 1 || n == 2){
//手上只剩下1瓶或2瓶的时候,兑换不成功。
return 0;
}
return nums(n - 3 + 1) + 1;//(原有的瓶子 - 兑换需要的空瓶子+得回的新瓶子) + 1,成功兑换1次。
}
int main(void) {
int n;
while (1) {
cout << "请输入空瓶子数:";
cin >> n;
if (n == 0) {
break;
}
cout << "可以兑换 " << nums(n) << " 瓶饮料" << endl << endl;
}
return 0;
}
输出: