编程算法案例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.算法设计:


通过逆推法,从最后一次出售开始逐个计算出每次出售前鱼缸中的金鱼数量,最后得到的数量即为鱼缸原来的金鱼数量。

具体步骤如下:

  1. 初始化变量 x 为最后一次出售前鱼缸中的金鱼数量(初始值为 11 条金鱼)。
  2. 从第四次出售到最后一次出售,共卖出 11+x 条金鱼,因此第三次出售前的金鱼数量为 (11+x)/(4/5)。
  3. 从第三次出售到最后一次出售,共卖出 11+x 条金鱼,因此第二次出售前的金鱼数量为 (11/3+x)/(3/4)。
  4. 从第二次出售到最后一次出售,共卖出 11+x 条金鱼,因此第一次出售前的金鱼数量为 (1/2+x)/(1/2+1)。
  5. 最后,鱼缸原来共有的金鱼数量为第一次出售前的金鱼数量乘以 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;
}