牛客网刷题:汽水瓶
这是一道趣味性题目,喝汽水空瓶子可以借一个再归还的方式,计算出最多可以喝多少瓶,相信很多小伙伴在以前的数学题中遇到过。
话不多说,直接开始题目:
描述
某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。
小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
数据范围:输入的正整数满足 1≤n≤100
注意:本题存在多组输入。输入的 0 表示输入结束,并不用输出结果。
输入描述:
输入文件最多包含 10 组测试数据,每个数据占一行,仅包含一个正整数 n( 1<=n<=100 ),表示小张手上的空汽水瓶数。n=0 表示输入结束,你的程序不应当处理这一行。
输出描述:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
示例1
输入:
3 10 81 0
复制输出:
1 5 40
复制说明:
样例 1 解释:用三个空瓶换一瓶汽水,剩一个空瓶无法继续交换 样例 2 解释:用九个空瓶换三瓶汽水,剩四个空瓶再用三个空瓶换一瓶汽水,剩两个空瓶,向老板借一个空瓶再用三个空瓶换一瓶汽水喝完得一个空瓶还给老板
直接上代码:
#include <iostream>
#include <vector>
using namespace std;
int DrinkNum(int emptybottle)
{
int result = 0;
if(emptybottle == 1)
return 0;
else if(emptybottle == 2)
return 1;
else
{
int left = 0;
result = emptybottle / 3;
left = emptybottle % 3 + result;
result += DrinkNum(left);
}
return result;
}
int main()
{
vector<int> vecdata;
int num = 0;
while(1)
{
cin>>num;
if(num == 0)
break;
vecdata.push_back(num);
}
for(auto &it :vecdata)
{
cout<<DrinkNum(it)<<endl;
}
return 0;
}
再来一段不使用函数递归的算法
#include <iostream>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
int ans = 0;
if (n == 0)
{
break;
}
while (n >= 3)
{
ans += n / 3;
n = n / 3 + n % 3;
}
if (n == 2)
{
ans++;
}
cout << ans << endl;
}
return 0;
}
小伙伴们仔细想一下,2个空瓶子时候就可以借一个空瓶子喝了再还回去,那不就是有多少个2就可以喝多少瓶么,余数如果是1是没有意义的,毕竟不允许借2个空瓶子。所以算法如下:
#include <iostream>
using namespace std;
int main()
{
int num = 0;
while (cin >> num)
{
if (num == 0)
break;
cout << num / 2 << endl;
}
return 0;
}