买饮料问题

问题描述:1元可买一瓶饮料,俩个空瓶可换一瓶饮料,编程计算n元可喝几瓶饮料

法一

n元至少可买n平饮料,产生n个空瓶,然后用空瓶换饮料

n个空瓶可换n/2瓶饮料,产生n/2个空瓶,那此时的空瓶数是n/2吗?不一定,当n为奇数时,哈药加上多出来的不足以换饮料的那一瓶。

一直换一直换,直到空瓶数<=1.

#define _CRT_SECURE_NO_WARNINGS 1
#include
int fun(int money)
{
	int total = money;//最初可喝的饮料
	int empty = money;//最初可产生的空瓶
	while (empty > 1)//证明空瓶可以换饮料
	{
		total = total + empty / 2;
		empty = empty / 2 + empty % 2;
	}
	return total;
}
int main()
{
	int money;
	scanf("%d", &money);
	int total = fun(money);
	printf("%d", total);
	return 0;
}

法二:找规律发现是2*money-1

所以可写为

#define _CRT_SECURE_NO_WARNINGS 1
#include
int fun(int money)
{
	int total;
    total=2*money-1;
	return total;
}
int main()
{
	int money;
	scanf("%d", &money);
	int total = fun(money);
	printf("%d", total);
	return 0;
}

法三:递归

#define _CRT_SECURE_NO_WARNINGS 1
#include
int fun(int empty)
{
	if (empty > 1)
	{
		int i = empty / 2;//产生的空瓶又能买这么多饮料
		int j = empty % 2 + empty / 2;//喝完之后又产生这么多空瓶
		return i + fun(j);
	}
	else
		return 0;
}
int main()
{
	int money;
	scanf("%d", &money);
	int empty = money;//最初产生了这么多空瓶
	int total = money+fun(empty);//fun用来计算这些空瓶可以再喝多少饮料
	printf("%d", total);
	return 0;
}

你可能感兴趣的:(算法)