作业标题
喝汽水问题
作业内容
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)。
2.解题思路
1.循环思路:
我们先用数学思想想一想20元能喝多少。
买20瓶,得到20个空瓶。可以换10瓶可乐。
10个空瓶还可以换5个瓶子。
5个空瓶可以换两瓶饮料,喝完一共还有3个空瓶。
还可以换一瓶可乐,喝完还有2个空瓶。
还可以换一瓶可乐。
一共可以换20+10+5+2+1+1=39瓶可乐。
2.递归思路:
我们想象一下20块钱我们分20次去买。
第一次买一瓶花1元,第二次买一瓶花1元,第三次用前两个空瓶加上1元换两瓶。
第四次用前两个空瓶加上1元换两瓶。
接下来的每一次都是相当于花1元钱和两个空瓶子,来获得两瓶新的汽水。
到最后一次时,手里已经没有钱了,即此时只有两个空瓶子换来一瓶汽水。
3.具体代码
代码1.循环方法:
#include<stdio.h>
int main()
{
int sum = 20; //汽水总数
int k = 0; //空瓶数
int s = 0; //剩余空瓶
k = 20;
while (k >= 1)
{
k = k + s;
sum = sum + k / 2;
s = k % 2;
k = k / 2;//2瓶汽水喝完就是1个瓶子
}
printf("%d\n", sum);
return 0;
}
代码1讲解:
- 定义sum为汽水总数,k是空瓶数,s是剩余的空瓶数。
- 将初始的汽水总数赋值给空瓶数
k
。 - 进入while循环,条件是空瓶数
k
大于或等于1。 k = k + s;
:将当前的空瓶数k
与剩余的空瓶数s
相加,作用是更新空瓶数。sum = sum + k / 2;
:将空瓶数除以2(因为2个空瓶可以换1瓶汽水),然后加到总汽水数sum
上,相当于更新总瓶数。s = k % 2;
:计算当前空瓶数除以2的余数,这个余数就是不能用来换汽水的空瓶数,也就是剩余空瓶数。(主要是奇数空瓶的时候用得上)k = k / 2;
:将空瓶数除以2,模拟喝掉2瓶汽水后剩下的空瓶数。
代码2.递归方法:
#include<stdio.h>
int Buy(int money)
{
if (money == 1)
return 1;
else
return Buy(money - 1) + 2;
}
int main()
{
int money = 20;
printf("%d\n", Buy(money));
return 0;
}
代码2讲解:
- 先进入main函数,定义money为20,代表有20块钱。
- 将money作为形参传递给Buy函数,得到的返回值打印。
- 进入Buy函数后,如果只剩1元,那么就返回1。否则就执行
Buy(money - 1) + 2;
ney为20,代表有20块钱。
2. 将money作为形参传递给Buy函数,得到的返回值打印。
3. 进入Buy函数后,如果只剩1元,那么就返回1。否则就执行Buy(money - 1) + 2;