今天在练习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 <stdio.h>
#include <windows.h>
#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;
}