买饮料问题
问题描述:1元可买一瓶饮料,俩个空瓶可换一瓶饮料,编程计算n元可喝几瓶饮料
法一
n元至少可买n平饮料,产生n个空瓶,然后用空瓶换饮料
n个空瓶可换n/2瓶饮料,产生n/2个空瓶,那此时的空瓶数是n/2吗?不一定,当n为奇数时,哈药加上多出来的不足以换饮料的那一瓶。
一直换一直换,直到空瓶数<=1.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
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<stdio.h>
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<stdio.h>
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;
}