【C、C++系列-10】C语言实现:百钱买百鸡问题

2023-05-16

【C、C++系列-10】C语言实现:百钱买百鸡问题

1. 问题

百钱买百鸡问题:我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题。该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?请编写C程序,解决“百钱买百鸡”问题。

2. 解决方案

将鸡翁、鸡母、鸡雏的数量分别从0到100进行变量,最后筛选条件为:钱的总数为100,鸡雏的数量能被3整除,鸡的总数为100。

3. 实现代码

#include <stdio.h>

/**
 * 百钱买百鸡问题:我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题。该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?请编写C程序,解决“百钱买百鸡”问题。
 * @return 程序的退出状态
 */
int main(void) {
    // 鸡翁、鸡母、鸡雏的数量
    int i, j, k;
    printf("百钱买百鸡的可能方案有:\n");
    for (i = 0; i <= 100; i++) {
        for (j = 0; j <= 100; j++) {
            for (k = 0; k <= 100; k++) {
                // 条件:钱的总数为100,鸡雏的数量能被3整除,鸡的总数为100
                if (5 * i + 3 * j + k / 3 == 100 && k % 3 == 0 && i + j + k == 100) {
                    printf("鸡翁=%d,鸡母=%d,鸡雏=%d\n", i, j, k);
                }
            }
        }
    }
    getchar();

    return 0;
}

4. 执行结果

执行结果:

在这里插入图片描述

百钱买百鸡的可能方案有:
鸡翁=0,鸡母=25,鸡雏=75
鸡翁=4,鸡母=18,鸡雏=78
鸡翁=8,鸡母=11,鸡雏=81
鸡翁=12,鸡母=4,鸡雏=84


Process finished with exit code 0

5. 解决方法说明——穷举法

基本概念:穷举法(Exhaustive Attack method),它是一种最为直接,最容易实现,同时又最为耗时的一种解决问题的算法思想。

穷举法算法的基本思想是:在可能的解空间中穷举出每一种可能的解,并对每一个可能解进行判断,从中得到问题的答案。

穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。

若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法。

用穷举法解题时,就是按照某种方式列举问题答案的过程。针对问题的数据类型而言,常用的列举方法一有如下三种:

  • (1)顺序列举 是指答案范围内的各种情况很容易与自然数对应甚至就是自然数,可以按自然数的变化顺序去列举。

  • (2)排列列举 有时答案的数据形式是一组数的排列,列举出所有答案所在范围内的排列,为排列列举。

  • (3)组合列举 当答案的数据形式为一些元素的组合时,往往需要用组合列举。组合是无序的。

暴力搜索或穷举搜索,在计算机科学中也称生成与测试,是一种非常低效的解决问题的技术,方法包括了系统地枚举解决方案的所有可能候选项,以及检查每个候选项是否符合问题描述。

找出自然数n的约数的暴力搜索算法将枚举出从1到n的所有整数,并检查它们中的每一个是否除n后没有余数。针对八皇后问题的暴力搜索算法会检查所有在8X8棋盘上八个“皇后”可能的摆放方法,并且,对每一种摆放方法,检查其每一个“皇后”是否能攻击到其它人。

虽然暴力搜索很容易实现,并且如果解决方案存在,它就一定能够找到。但是它的代价是和候选方案的数量成正比,由于这一点,在很多实际问题中,消耗的代价会随着问题规模的增加而快速地增长。因此,当问题规模有限,或当存在可用于将候选解决方案的集合减少到可管理大小的针对特定问题的启发式算法时,通常使用暴力搜索。另外,当实现方法的简单度比速度更重要的时候,也会用到这种方法。

例如,在关键的应用中,或当用计算机证明数学定理时,算法中的任何错误将会导致严重的后果。暴力搜索也可在其他基准化算法和启发式算法里用作基准方法。事实上,暴力搜索可以被看作最简单的启发式算法。暴力搜索与回溯概念是不相同的,在回溯算法中,大量的解决方案并没有被枚举而直接被丢弃(例如上文提到的“八皇后问题”的解决方案)。用于在表中查找一个项目,也就是说顺序地检查表中所有条目的暴力方法被称为线性搜索。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C、C++系列-10】C语言实现:百钱买百鸡问题 的相关文章

随机推荐