有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
首先定义变量:空瓶的数量empty,总共喝掉的汽水瓶数total。
当拥有的汽水瓶数量大于等于3时进入循环模拟交换的操作。如第一次进入循环,能交换到的汽水数量等于空瓶数量除3取整(empty/3),此时我们手里拥有的气瓶数量为交换到的气瓶数量empty/3再加上我们交换所剩的气瓶数(即empty%3,假设有5个气瓶交换了3个还剩下2个未能交换).当空瓶(empty)数量大于等于3时继续进入第二次循环,直到空瓶数量少于3为止。
注意题目最后的提示,拥有两个瓶子时可以找老板借汽水,然后将三个瓶子换的汽水还给老板(老板表示很凎!)即当空瓶数量等于2的时候直接让所喝的汽水数量(total)加上一。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int empty = 0; //对空瓶进行定义 int total = 0; //对总计所喝的汽水数量进行定义 scanf("%d", &empty); while (empty >= 3) //循环条件为空瓶数量大于或等于3 { total += empty / 3; //交换所得到的汽水 empty = empty / 3 + empty % 3; //拥有的空瓶数 if (empty == 2) //当剩下的空瓶数为2的时候可再喝一瓶 total += 1; } printf("total=%d", total); //输出结果 return 0; }
下图是测试例子,所用的编译器为VS2022