某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。
小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
数据范围:输入的正整数满足
注意:本题存在多组输入。输入的 0 表示输入结束,并不用输出结果。
输入描述
输入文件最多包含 10 组测试数据,每个数据占一行,仅包含一个正整数 n( 1<=n<=100 ),表示小张手上的空汽水瓶数。n=0 表示输入结束,你的程序不应当处理这一行。
输出描述:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
输入例子1:
3 10 81 0
输出例子1:
1 5 40
例子说明1:
样例 1 解释:用三个空瓶换一瓶汽水,剩一个空瓶无法继续交换 样例 2 解释:用九个空瓶换三瓶汽水,剩四个空瓶再用三个空瓶换一瓶汽水,剩两个空瓶,向老板借一个空瓶再用三个空瓶换一瓶汽水喝完得一个空瓶还给老板
#include<iostream>
#include<vector>
using namespace std;
int calc(int number)
{
if (number == 1 || number == 0)
{
return 0;
}
if (number == 2)
{
return 1;
}
if (number >= 3)
{
return (number / 3) + calc(number % 3 + (number / 3));
}
return 0;
}
int main()
{
vector<int> data;
int index = 0;
while (1)
{
int temp = 0;
cin >> temp;
data.push_back(temp);
if (data[index] == 0)
{
break;
}
else
{
index++;
}
}
//Calc
for (int i = 0; i < index; i++)
{
cout << calc(data[i]) << endl;
}
return (0);
}
法2:通过数学分析,最后获得的饮料数是总空瓶数整除2 。
#include<stdio.h>
int main ()
{
int m;
while(~scanf("%d",&m)&&m!=0) printf("%d\n",m/2); //循环从输入流读取m,直到遇到EOF为止
return 0;
}
法3:C++递归的方法
//递归方法
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n;
while(sc.hasNext())
{
n=sc.nextInt();
System.out.println(Drink(n));
}
}
public static int Drink(int n)
{
if(n<=0)
return 0;
else if(n==3)
return 1;
else if(n==2)
return 1;
else//此时表明对应为3的倍数,递归
{
int h=0;
h=n/3;
return h+Drink(n-3*h+h);
}
}
}
Python: 3换1(剩2加1)程序迭代解法
import numpy
if __name__ == '__main__':
print('Start!')
n = int(input())
m = 0
if n < 2:
print('You get no reward bottle!')
elif n == 2:
print('You get 1 bottle!')
else:
while n>2:
m = m + n//3
n = n//3 + n%3
if n == 2:
print('You get ', m + 1, ' bottle!')
else:
print('You get ', m, ' bottle!')