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

发布时间:2024年01月22日

一、题目描述

? ? ? ? 已知买了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;
}

三、结语

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

文章来源:https://blog.csdn.net/2301_80321602/article/details/135729176
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。