【C】推理题之能喝多少瓶水

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、输出结果


猜你喜欢

转载自blog.csdn.net/sustzc/article/details/80050826