C语言学习之喝汽水小程序

今天在练习C语言编程的时候,碰到这样一个问题,感觉很有意思,下面小编将分享自己解决这个问题时的一些思路,欢迎大家前来评论。

Question:喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,假设你有指定数量的金额,那么可以喝多少瓶汽水?

问题分析:在解决这个问题的时候,如果我现在所拥有的金额是2的整数次方,那么问题将会很简单;比如我现在有16元钱,那么我每次喝的汽水的数量为:16——>8——>4——>2——>1,最后只需要将这些数加起来即可。然而如果将金额看成随机数,那么2的整数次方只是沧海一粟,比如我现在有20元钱,那么我每次喝汽水的数量为:20——>10——>5——2——1 ?这样正确吗?细心的你肯定会发现当我第三次喝完之后,我的手里还会有一个空瓶,这样一来,加上最后的那个瓶子,我还可以再喝一瓶。那么问题就来了,我们要如何去处理这样的问题,以下是小编的解决过程。

在实际的解决过程中,我需要去定义两个变量 count_t count_r,这两个变量分别用来存储每一轮之后用于下一轮兑换的数量(2的整数倍)和剩余的空瓶个数(每轮最多为1)。如代码中所示,当空瓶总数大于1时进入循环,分为三种情况进行统计:①当前的空瓶数量是2的整数倍(count_t是2的整数倍,count_r为0),②当前数量+之前剩余的数量是2的整数倍(count_t为奇数,count_r为1),③当前数量为奇数(count_t为奇数,count_r为0)。这里需要注意的是:在判断第二条的时候,需要加上判定条件(count_r 不为0),若不加条件,则第三条永远不会执行;同时,在第二条的语句中,需要将使用后的count_r清零。

 

#include 
#include 

#pragma warning(disable:4996)

int Count(int count)
{
	int count_t = count;  //用于计算每轮用于兑换的空瓶个数
	int count_r = 0;    //用于保存剩余的空瓶
        //循环终止条件为所有的空瓶数量小于1
	while ((count_t + count_r) > 1){
		if (count_t % 2 == 0){
			count_t /= 2;
			count += count_t;
		}
		else if (count_r!=0 && ((count_r + count_t) % 2 == 0 || count_r % 2 == 0)){
			count_t += count_r;
			count_t /= 2;
			count += count_t;
			count_r = 0;    //使用后,清零
		}
		else{
			count_r++;
			count_t /= 2;
			count += count_t;
		}
	}
	return count;
}

int main()
{
	printf("请输入需要查询的钱数:");
	int money = 0;
	scanf("%d", &money);
	printf("%d 元钱可以喝 %d 瓶饮料\n", money, Count(money));

	system("pause");
	return 0;
}

 

你可能感兴趣的:(C语言)