普通版:
- money:钱
- total:统计瓶数
- empty:空的瓶数
#include<stdio.h>
int main()
{
int money = 0;
scanf("%d",&money);
int total = money;
int empty = money;
while (empty >= 2)
{
total += empty / 2;
empty = empty / 2 + empty % 2;
}
printf("%d", total);
return 0;
}
数学算法
total= money× 2 - 1
明确两点:
- 最后总要剩下一个空瓶。
- 换取的瓶子数量加1等于一开始买的数量(假定一开始就花完所有钱),即左边面积等于右边面积
- 偶数很好理解:(假设有16块钱)
浅绿色的那块的就是money× 2 - 1减去的1
- 奇数的情况比较复杂
先以简单的为例(假设有17块钱)
右边就是跟16一样的偶数循环了,只不过偶数循环剩下的空瓶和17到8多出来的那个空瓶又增加了一瓶。
复杂一点(假设有11块钱)
上面红色的1 和黑色的1就是奇数多出来的空瓶(橙色数字)换的
其实11块钱就是10块钱多了一个空瓶,把这个空瓶和10结束的那个空瓶换就多了1瓶。图像左右两边都是加1。