首页 > 试题广场 > 汽水瓶
[编程题]汽水瓶

有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?


输入描述:

输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。



输出描述:

对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。

示例1

输入

3
10
81
0

输出

1
5
40
#include<stdio.h>
int main (){
    int m;
    while(~scanf("%d",&m)&&m!=0) printf("%d\n",m/2);
    return 0;
}

通过数学分析,最后获得的饮料数是总空瓶数整除2 。
编辑于 2016-03-04 16:22:57 回复(96)

python解法,思路,每两个汽水瓶换一个,所以除以2就行了。

while True:
    try:
       a=int(input())
       if a!=0:
           print(a//2)

    except:
        break
发表于 2017-10-04 20:08:50 回复(19)
/*
递归问题
3个瓶子换1瓶水+1个空瓶子,两个瓶子换1瓶水+0个空瓶子,1个瓶子换0瓶水。
f(1) = 0
f(2) = 1
f(3) = 1
f(4) = f(2)+1    //4个瓶子,其中3个可以换1瓶水+1个空瓶,所以是f(2)+1
f(5) = f(3)+1    //3个瓶子换1瓶水+1个空瓶,所以是f(3)+1
...
f(n) = f(n-2)+1 */
#include <iostream>
 
using namespace std;
 
int f(int n)
{
    if(n==1) return 0;
    if(n==2) return 1;
    return f(n-2)+1;
}
 
int main()
{
    int n;
    while(cin >> n){
        if(n==0)
            break;
        cout<<f(n)<<endl;
    }
    return 0;
}

发表于 2016-03-01 22:03:43 回复(12)
能喝的瓶数=目前空瓶数除以2
#include <iostream>
using namespace std;
int main(int argc,char *argv[]){
    int n;
    while(cin>>n){
            cout<<n/2<<endl;
    }
    return 0;
}

编辑于 2016-06-18 22:58:34 回复(12)
#include<iostream>

using namespace std;

int main(){
    int n;
    while(cin>>n){
        if(n == 0) break;
        //正常的解法
        /*int ret = 0;
        int a, b;
        while(n >= 3){
            a = n/3;
            b = n%3;
            ret += a;
            n = a + b;
        }
        if(n == 2) ret += 1;
        cout<<ret<<endl;*/
        //从给的样例中可以观察出来的规律
        cout<<n/2<<endl;
    }   
    return 0;
}

发表于 2017-06-14 17:37:47 回复(5)
//递归方法
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);
        }
            
        
    }
}

发表于 2016-08-11 17:53:14 回复(8)
import java.util.Scanner;
public class Main {
    private static int blank;
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            blank = scan.nextInt();
            int drink = 0;
            int remain;
            if (blank > 0 && blank <= 100) {
                if (blank == 1) {
                    drink = 0;
                } else if (blank == 2) {
                    drink = 1;
                }
                while (blank > 2) {  //10,4,5
                    drink += blank / 3;   //3 drink,4 drink
                    remain = blank % 3;  //1 remain,1 remain
                    blank = blank / 3 + remain;   //4 blank,2 blank
                    if (blank == 2) {
                        drink++;
                    }
                }
            }
            System.out.println(drink + "");
        }
    }
}
 

发表于 2016-04-05 20:24:53 回复(3)
# python3
import sys
def drink(n):
    if n <2:
        return 0
    elif n==2:
        return 1
    # 喝过的汽水数 -> n//3
    # 剩下的空瓶数 -> n//3 + n%3
    return n//3+drink(n//3+n%3)
for line in sys.stdin:
    n = int(line.strip())
    res =0
    res =drink(n)
    print(res)

发表于 2019-09-03 22:07:37 回复(0)
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int num = sc.nextInt();
            if(num == 0 || num < 1 || num > 100)
            	break;
            int m = num / 3;
            int n = num % 3;
            int count = m;
            while(m > 0){
            	int temp1 = m;
            	int temp2 = n;
            	m = (temp1 + temp2) / 3;
            	n = (temp1 + temp2) % 3;
            	count += m;
            }
            if(m == 0 && n == 2)
            	count++;
            System.out.println(count);
        }
        sc.close();
    }
}

发表于 2016-08-14 16:59:01 回复(2)
#include <iostream>
#include <vector>
using namespace std;
int getCount(int n)
{
int t_count = 0;
    
if(n == 1 || n == 0)
        
{
        
return 0;
    }
    
if(n == 2)
        
{
        
return 1;
    }
    
t_count = n/3 + getCount(n%3 + n/3);
    
return t_count;
}

int main()
    
{
    int n=0;
    
vector<int> temp;
    for(int i = 0; i < 10; i++)
        
{
        
cin >> n;
        
if(n == 0)
            
{
            
break;
        }
        temp.push_back(n);
    }
    
 for(int i = 0; i < temp.size(); i++)
{
        
int count = getCount(temp[i]);
        
cout << count << endl;
    }
return 0;
}

答案错误:您提交的程序没有通过所有的测试用例

测试用例:
94

对应输出应该为:

47

你的输出为:

47
47

这个是什么情况啊????
发表于 2016-02-22 15:29:29 回复(9)
#include<stdio.h>
int func(int n){
    int ans=0;
    while(n>=3){
        ans+=n/3;
        n=n%3+n/3;
    }
	if(n==2)
		ans+=1;
    return ans;
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF&&n){
        printf("%d\n",func(n));
    }
    return 0;
}


发表于 2016-10-09 21:17:04 回复(0)
#include <iostream> 
using namespace std;
int main()
{
    int a,sum,num,quotients;
    while(true){
        cin>>a;
        if(a==0) return 0;
        num=a;
        sum=0;
        while(num/3!=0){
            quotients=num/3;
            num=num%3+quotients;
            sum+=quotients;
        }
        if(num==2) sum+=1;
        cout<<sum<<endl;
    }
    return 0;
}
编辑于 2016-02-10 00:07:13 回复(7)
最中规中矩的答案如此
#include <iostream>
using namespace std;

int cot(int num)
{
    if(num < 2)
        return 0;
    else if(num == 2)
        return 1;
    else
        return num / 3 + cot(num / 3 + num % 3);
}

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


编辑于 2019-07-28 16:22:40 回复(0)
根据输入、输出描述,最多包含10组测试数据;
不确定是输一个就显示还是输完之后再显示,我是先按输完之后在显示的思路来做的,那么需要用一个数组保存输入的内容,根据输入描述,数组中的元素只能是1~100之间的,0退出,因此需要做校验;
遍历数组,根据例子的思路进行计算,打印最终结果;
三个瓶盖换一瓶汽水”可以看做变化因子,当它为4或5或其他时,也能计算出对应的值。
import java.util.*;
public class Main{
    public void static main(String[] agr0){
        int times = 10; // 数组容量(10组测试数据)
        int factor = 3; // 因子(三个瓶盖换一瓶汽水)
        List<Integer> scanList = new ArrayList<>();
        System.out.println("请输入空汽水瓶数:");
        Scanner scanner = new Scanner(System.in);
        while (times > 0) {
            int nextInt = scanner.nextInt(); // 每组空瓶数量
            if (nextInt != 0 && (nextInt < 1 || nextInt > 100)) {
                System.out.println("空汽水瓶数量只能在1~100之间,请重新输入");
                continue;
            }
            if (nextInt == 0) {
                break;
            }
            scanList.add(nextInt);
            times--;
        }
        for (Integer n : scanList) {
            if (n == 0) {
                continue;
            }
            int count = n / factor;// 根据空瓶兑换得到的汽水瓶数量
            int m = count + n % factor; // 瓶盖数量=兑换后的汽水瓶数量 + 原来空瓶剩余的瓶盖数量
            while (m >= factor) {
                int temp = m / factor; // 兑换的汽水瓶,也等于瓶盖
                count += temp; // 汽水数量+兑换的汽水
                m = m % factor + temp; // 剩余的瓶盖=兑换剩余的瓶盖+兑换到的瓶盖
            }
            if (m == (factor - 1)) { // 剩余的瓶盖=2时,可以和老板借一瓶
                count++;
            }
            System.out.println(count); // 打印本次空瓶兑换到的汽水数量
        }
        scanner.close();
    }
}

编辑于 2019-10-17 15:33:15 回复(0)
//规律是 3-1   4-2  5-2   6-3    7-3   8-4  9-4  10-5  11-5
//因此可以直接判定就是输出为输入/2
import java.util.Scanner;

public class Qi_shui_ping {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
    while(sc.hasNext())
    {
        int t=sc.nextInt();
        if(t!=0)
        System.out.println(t/2);
    }
    }
}


发表于 2019-04-23 11:13:26 回复(0)
#include <iostream>
using namespace std;
int main ()
    {
    int num,crt=0,tem;
    while(cin>>num)
        {
        if (num==0)
            break;
        while(num>2)
            {
            tem=num/3;
            num=tem+num%3;
            crt=crt+tem;
            }
        if(num==2)
            crt++;
        cout<<crt<<endl;
        }
    return 0;
    } 测试用例: 94 对应输出应该为: 47 你的输出为: 76 
请问一下,为啥我本地测试答案正确,提交老是提示错误呢???谢谢
发表于 2018-07-05 22:30:35 回复(1)
/***********************************************************************
问题描述:汽水瓶问题;再利用问题;多想一步
思路:循环处理;n%3,n/3
完成时间:2018年5月28日
***********************************************************************/

#include <stdio.h>

int main(){
    int n,i,j,div_main,div_remain,count;
    while(scanf("%d",&n)!=EOF && n != 0){
        //方法一:常规解法
        count=0;                       //循环内部初始化计数变量
        while(n>2){
            div_main = n/3;            //换回的汽水瓶数
            count += div_main;
            n = div_main + n%3;        //新的空瓶数div_main + n%3
        }
        if(n == 2){
            count = count + 1;
        }
        else
            count = count;
        printf("%d\n",count);
        //方法二参考了大神的分析:观察输入输出规律,n整除2就可以了
        //printf("%d\n",n/2);
    }
    return 0;
}


发表于 2018-05-28 14:06:10 回复(0)
这个递归应该挺好懂的
#include <stdio.h>
int fun(int n){
    if(n==2||n==3){
        return 1;
    }
    else return 1+fun(n-2);
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        printf("%d\n",fun(n));
    }
    return 0;
}

发表于 2018-02-22 11:23:35 回复(0)
#include <iostream>
using namespace std;
int main(){
	int n;
	while (cin >> n)cout << n / 2 << endl;
	return 0;
}

发表于 2016-08-06 15:44:46 回复(0)

#include<iostream>

using namespace std;

int main()
{
    int n;
    while (cin >> n && n != 0) {
        cout << n/2 << endl;
    }
   
    return 0;
}

发表于 2016-03-18 17:11:55 回复(0)