编程算法案例12
作者:championsky | 发布时间:
出售金鱼
1.问题描述
小明将养的一缸金鱼分5次出售:第1次卖出全部的一半加1/2条;第2次卖出余下的三分之一加1/3条;第3次卖出余下的四分之一加1/4条;第4次卖出余下的五分之一加1/5条;最后卖出余下的11条。试编程求出原来鱼缸中共有多少条金鱼。
2.问题分析:
一个圆形的养鱼缸,分成四等份,每区域放置的金鱼数量均相等。将鱼缸里除去 10 条外的金鱼数清空后,四个区域的金鱼数量分别卖出 1 条、2 条、3 条和 4 条,之后鱼缸里剩下的金鱼数量与鱼缸中一开始的金鱼数量比例为 4:5,求鱼缸最开始共有多少条金鱼。
3.算法设计:
通过逆推法,从最后一次出售开始逐个计算出每次出售前鱼缸中的金鱼数量,最后得到的数量即为鱼缸原来的金鱼数量。
具体步骤如下:
- 初始化变量 x 为最后一次出售前鱼缸中的金鱼数量(初始值为 11 条金鱼)。
- 从第四次出售到最后一次出售,共卖出 11+x 条金鱼,因此第三次出售前的金鱼数量为 (11+x)/(4/5)。
- 从第三次出售到最后一次出售,共卖出 11+x 条金鱼,因此第二次出售前的金鱼数量为 (11/3+x)/(3/4)。
- 从第二次出售到最后一次出售,共卖出 11+x 条金鱼,因此第一次出售前的金鱼数量为 (1/2+x)/(1/2+1)。
- 最后,鱼缸原来共有的金鱼数量为第一次出售前的金鱼数量乘以 2。
Python 代码实现
# 计算金鱼数量
def solve():
# 最后一次出售后鱼缸中剩余的金鱼数量
x = 11
# 第四次出售至最后一次出售共卖出了11+x条金鱼
# 计算第三次出售前的金鱼数量
x = (x + 11) / (4/5)
# 计算第二次出售前的金鱼数量
x = (x + 11/3) / (3/4)
# 计算第一次出售前的金鱼数量
x = (x + 1/2) / (1/2 + 1)
# 计算鱼缸原来共有的金鱼数量
return int(x * 2)
# 测试
print(solve()) # 输出结果为59
运行结果:
程序输出结果为 59,即鱼缸原来共有 59 条金鱼
JAVA代码实现
public class Main {
public static void main(String[] args) {
int x = 11;
// 第四次出售至最后一次出售共卖出了11+x条金鱼
// 计算第三次出售前的金鱼数量
x = (int)((x + 11) / (4.0 / 5));
// 计算第二次出售前的金鱼数量
x = (int)((x + 11.0 / 3) / (3.0 / 4));
// 计算第一次出售前的金鱼数量
x = (int)((x + 1.0 / 2) / (1.0 / 2 + 1));
// 计算鱼缸原来共有的金鱼数量
int res = x * 2;
System.out.println(res);
}
}
C++代码实现
#include <iostream>
using namespace std;
int main() {
int x = 11;
// 第四次出售至最后一次出售共卖出了11+x条金鱼
// 计算第三次出售前的金鱼数量
x = (int)((x + 11) / (4.0 / 5));
// 计算第二次出售前的金鱼数量
x = (int)((x + 11.0 / 3) / (3.0 / 4));
// 计算第一次出售前的金鱼数量
x = (int)((x + 1.0 / 2) / (1.0 / 2 + 1));
// 计算鱼缸原来共有的金鱼数量
int res = x * 2;
cout << res << endl;
return 0;
}