汽水瓶
1.题目描述
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
2.格式与样例
输入
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。
输出
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
样例输入
3
10
81
0
样例输出
1
5
40
3.参考答案
思路分析:
假设n为最初始的空饮料瓶数,sum为已经喝的饮料瓶数。则有如下三种情况:
1) 当 n <= 1 时,就不能兑换了,直接 return sum;
2) 当 n == 2 时,根据题意可以多兑换一瓶饮料,sum += 1; return sum;
3) 当 n >= 3 时,一次性兑换的瓶子数为 tmp = n / 3;兑换完之后剩余饮料瓶数为 rest = n % 3;rest还要加上兑换的瓶子数(已经喝完 为空) rest += tmp;
这就是在一次兑换后剩余的瓶子数,然后递归调用,继续处理此时的rest。
参考代码如下:
#include <stdio.h>
#include <math.h>
int sum = ;
int process(int n)
{
int rest;
int tmp;
if (n <= )
{
return sum;
}
if (n == )
{
sum += ;
return sum;
}
if (n >= )
{
rest = n % ;
tmp = n / ;
sum += tmp;
rest += tmp;
process(rest);
}
}
int main()
{
int a[];
int i = ;
while (scanf("%d", &a[i]) != EOF && a[i] >= && a[i] <= )
{
i++;
}
int j;
int havedrinum;
for (j = ; j < i; j++)
{
havedrinum = process(a[j]);
printf("%d\n", havedrinum);
sum = ; //每次处理完一个数据之后不要忘记把sum清零
}
return ;
}
END