~喝多少瓶汽水~(C语言)~刷题

文章讲述了如何通过编程解决一个关于用空瓶兑换汽水的问题,介绍了两种方法:一种是详细计算每一步的兑换过程,另一种是简化处理特殊情况。最后给出了C语言的代码实现和实际花费的计算。
摘要由CSDN通过智能技术生成

一、题目描述

        已知买了n瓶汽水(3元一瓶),两个空瓶可兑换一瓶汽水,问一共喝了多少瓶汽水?实际花了多少钱?每次用空瓶换汽水,直到手中的剩余空瓶数不够再换一瓶汽水为止。


二、题目分析 

        方法一:

假设:

        1. 买了10瓶汽水,喝完汽水剩10个空瓶,换了5瓶汽水;

        2. 喝完5瓶汽水,还剩5个空瓶,换了2瓶汽水,还剩下1个空瓶;

        4. 喝完2瓶汽水,加上剩下的1个空瓶,一共3个空瓶,换1瓶汽水,还剩下1个空瓶;

        5. 喝完1瓶汽水,加上剩下的1个空瓶,一共2个空瓶,换1瓶汽水;

        6. 喝完1瓶汽水,剩下1个空瓶,不能继续兑换汽水;

        一共喝了10+5+2+1+1=19瓶汽水。

                以此类推

思路:

        1. 首先,计算出兑换前总汽水的数量total;

        2. 然后,更新手中的空瓶数量empty,其中包括兑换得到的汽水瓶数和剩余的空瓶数;

        3. 每次将剩余的空瓶数量empty除以2,得到换取的汽水数量,并加到total中;

        4. 将剩余的空瓶数量empty模2和empty除以2的和的值重新赋给empty,表示剩余的空瓶兑换汽水喝完后剩下的空瓶数量;(注:不要忘记加上上一次兑换汽水喝完后剩下的空瓶数量

        5. 重复2和3,直到剩余的空瓶数不能再兑换一瓶汽水。

        代码实现: 

#include<stdio.h>

int main()
{
	int num=0; /*购买汽水数*/
	int total = 0; /*总共喝多少瓶汽水*/
	int empty=0; /*手里的空瓶数量*/
	int sum = 0; /*实际花费*/
	printf("输入购买汽水数量:\n");
	scanf("%d", &num);

	total = num; /*兑换总前汽水瓶数*/
	empty = num;

	/*重复用手里的空瓶兑换汽水,直到手里的空瓶数小于2个*/
	do
	{
		total += empty / 2;
		empty = empty / 2 + empty % 2;
	} while (empty >= 2);

    //实际花费=num(最初购买汽水数)*3-(total(喝汽水总数)-num(最初购买汽水数))*3
	sum = num * 3 - (total - num) * 3;

	printf("总共喝了%d瓶汽水,实际花费了%d元\n", total,sum);
	
	return 0;
}

方法二:

       一种简化的实现方式,只考虑没有购买汽水的情况和购买了汽水的情况。

        我们可以理解为:2个空瓶可以换到1瓶汽水和1个空瓶,相当于1个空瓶可以换1瓶汽水,最后一定会剩余1个空瓶。所以n元可以买n瓶汽水,n瓶汽水相当于n个空瓶,能换n-1瓶汽水。一共可以换2n-1瓶汽水(n>=1)。

        代码实现:

#include <stdio.h>
int main()
{
    int num = 0; /*购买汽水数*/
    int total = 0; /*总共喝多少瓶汽水*/
    int empty = 0; /*手里的空瓶数量*/
    int sum = 0; /*实际花费*/
    printf("输入购买汽水数量:\n");
    scanf("%d", &num);

    //如果没买汽水,则可以喝到0瓶汽⽔,否则喝到2*n-1瓶汽水
    if (num == 0)
    {
        total = 0;
    }
    else
    {
        total = 2 * num - 1;
        //实际花费=num(最初购买汽水数)*3-(total(喝汽水总数)-num(最初购买汽水数))*3
        sum = num * 3 - (total - num) * 3;
    }
    printf("总共喝了%d瓶汽水,实际花费了%d元\n", total, sum);

    return 0;
}

三、结语

        希望这篇文章对大家有所帮助,如果你有任何问题和建议,欢迎在评论区留言,这将对我有很大的帮助。

  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值