问题,一瓶汽水一元钱,每两个空瓶可以换一瓶汽水,问给你20元,能喝多少瓶汽水?
逻辑分析:
汽水数 空瓶数
20 20(20元买的20瓶汽水喝完得20个空瓶)
10(20个空瓶换的) 10(空瓶换的10瓶汽水喝完)
5 5
2(5个空瓶换2瓶,剩一个空瓶) 总共3个 2(刚刚换的2瓶喝完)+1(上一次换的还剩下一个)
1(3个空瓶换1瓶,剩一个空瓶) 总共2个(刚刚换的一瓶喝完和上一次剩下的一瓶)
1 (2个空瓶换的) 0(2个空瓶正好换完)
编程实现:
void main()
{
int x, a; //a表示当前空瓶能换的饮料数,x表示钱。
scanf("%d", &x);
int total = x; //total表示总的饮料数
int battle = x; //battle表示当前空瓶数
while(battle>=2) //当空瓶只有1个或0个的时候就无法继续换饮料则跳出循环
{
if(battle%2==0) //当为双数空瓶时
{
a = battle / 2; //当前空瓶能换的饮料为空瓶数的一半。
battle = battle / 2; //空瓶换了以后更新现有空瓶数。
total=total+a; //换了饮料以后记得更新总的饮料数
}
if (battle % 2 != 0) //当为单数空瓶时
{
a = battle / 2; //当前空瓶能换的饮料为空瓶数的一半(为奇数时也是一半)
battle = battle / 2 + 1; //这里需要注意,当空瓶为单数时,还剩的空瓶数为当前除以2加1,因为这里两个整型相除还是整型,如5/2结果是2,但实际还有1个瓶子没有换,所有这里剩余的瓶子应该是battle/2+1。
total=total+a; //更新总数
}
}
printf("%d",total);
}
这里还有更优化的写法,不用区别单数空瓶和双数空瓶
total=total+battle / 2;
battle=battle/2+battle%2;
可以参考理解一下。