1、问题描述
1瓶水1元,2个空瓶可以换1瓶水,20元可以买多少瓶水?
2、算法分析
通过穷举的方法来找寻该问题的规律,以下算法均不考虑借别人瓶子:
假设只有1元,那么喝完这瓶水后,剩下1个空瓶,不满足换水的规定,因此1元可以买1瓶水;
假设只有2元,那么喝完2元买的水后,剩下2个空瓶,而这2个空瓶又可以换1瓶水,那么喝完换来的这瓶水后,就只剩下1个空瓶,不满足换水的规定,因此2元可以买2+1=3瓶水;
假设只有3元,那么喝完3元买的水后,剩下3个空瓶,而这3个空瓶又可以换1瓶水(ps:只需要2个空瓶,此时还有3-2=1个空瓶),那么喝完换来的这瓶水后,还剩下2个空瓶(ps:换来的1瓶加上换之前剩下的1瓶),这时候又可以换1瓶,那么喝完换来的这瓶水后,就只剩下1个空瓶,不满足换水的规定,因此3元可以买3+1+1=5瓶水;
假设只有4元,那么喝完4元买的水后,剩下4个空瓶,而这4个空瓶又可以换2瓶水,那么喝完换来的这2瓶水后,就剩下2个空瓶,这时候又可以换1瓶,那么喝完换来的这瓶水后,就只剩下1个空瓶,不满足换水的规定,因此4元可以买4+2+1=7瓶水;
假设只有5元,那么喝完5元买的水后,剩下5个空瓶,而这5个空瓶又可以换2瓶水(ps:只需要4个空瓶,此时还有5-4=1个空瓶),那么喝完换来的这2瓶水后,还剩下3个空瓶(ps:换来的2瓶加上换之前剩下的1瓶),这时候又可以换1瓶,那么喝完换来的这瓶水后,还剩下2个空瓶(ps:换来的1瓶加上换之前还有1个空瓶),还可以再换1瓶水,那么喝完换来的这瓶水后,就只剩下1个空瓶,不满足换水的规定,因此5元可以买5+2+1+1=9瓶水;
假设只有6元,那么喝完6元买的水后,剩下6个空瓶,而这6个空瓶又可以换3瓶水,那么喝完换来的这3瓶水后,就剩下3个空瓶,这时候又可以换1瓶,那么喝完换来的这瓶水后,还剩下2个空瓶(ps:换来的1瓶加上换之前还有1个空瓶),这时候可以继续换1瓶水,那么喝完换来的这瓶水后,就只剩下1个空瓶,不满足换水的规定,因此6元可以买6+3+1+1=11瓶水;
...........
假设只有20元,那么喝完20元买的水后,剩下20个空瓶,而这20个空瓶又可以换10瓶水,那么喝完换来的这10瓶水后,就剩下10个空瓶,这时候又可以换5瓶,那么喝完换来的这5瓶水后,还可以换2瓶水,喝完换来的2瓶水,还剩下3个空瓶(ps:换来的2瓶加上换之前还有1个空瓶),这时候可以继续换1瓶水,那么喝完换来的这瓶水后,还剩下2个空瓶(ps:换来的1瓶加上换之前还有1个空瓶),再换上1瓶水,最后只剩下1个空瓶,不满足换水的规定,因此20元可以买20+10+5+2+1+1=39瓶水;
............
综上所述,1元可以买1瓶水,2元可以买3瓶水,3元可以买5瓶水,4元可以买7瓶水,5元可以买9瓶水,6元可以买11瓶水,...20元可以买39瓶水...
1=1*2-1;
3=2*2-1;
5=3*2-1;
7=4*2-1;
9=5*2-1;
11=6*2-1;
...
39=20*2-1;
...
不难发现这样一个规律:n元可以买2*n-1瓶水,实际上,这里减去1就是不考虑借别人瓶子,这样手里始终会剩下一个瓶子无法兑换。
3、源代码
#define _CRT_SECURE_NO_WARNINGS 1 /* * Copyright (c) 2018, code farmer from sust * All rights reserved. * * 文件名称:BuyWaterCount.c * 功能:1瓶水1元,2个空瓶可以换一瓶水,20元可以买多少瓶水。 * 不考虑借别人瓶子 * 当前版本:V1.0 * 作者:sustzc * 完成日期:2018年4月20日12:13:47 */ # include <stdio.h> # include <assert.h> int main(void) { int count = 0; int money = 0; printf("input money:\n"); assert((1 == scanf("%d", &money)) && (money > 0)); count = 2 * money - 1; printf("%d yuan can buy %d bottles of water!\n", money, count); return 0; }
4、输出结果