服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 详解C语言处理算经中著名问题百钱百鸡

详解C语言处理算经中著名问题百钱百鸡

2022-10-07 16:09飞向星的客机 C/C++

古代的很多数学问题都可以用现代的编程语言去尝试解决,就如本篇,将会带你通过C语言来解决算经中百钱百鸡问题,感兴趣的朋友来看看吧

前言

Wassup guys,我是Edison

今天是C语言每日一练,第117天!

Let's get it!

详解C语言处理算经中著名问题百钱百鸡

 

1. 问题描述

中国古代数学家张丘健在他的 《算经》 中提出了一个著名的 “百钱百鸡问题” 一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?

 

2. 问题分析

如果用百钱只买公鸡,最多可以买20只,但题目要求买一百只,所以公鸡数量在 0~20 之间。 同理,母鸡数量在 0~33 之间。 在此把公鸡、母鸡和小鸡的数量分别设为cock、hen、chicken,则 c o c k + h e n + c h i c k e n = 100 cock+hen+chicken=100 cock+hen+chicken=100 因此百钱买百鸡问题就转换成解不定方程组的问题了:

详解C语言处理算经中著名问题百钱百鸡

 

3. 算法思路

对于不定方程组,我们可以利用穷举循环的方法来解决。 公鸡范围是 0~20,可用语句for(cock=0; cock<=20; cock++)实现。 钱的数量是固定的,要买的鸡的数量也是固定的,母鸡数量是受到公鸡数量限制的。 同理,小鸡数量受到公鸡和母鸡数量的限制,因此可以利用三层循环的嵌套来解决:第一层循环控制公鸡数量,第二层控制母鸡数量,最里层控制小鸡数量。

详解C语言处理算经中著名问题百钱百鸡

 

4. 代码实现

 

#include <stdio.h>

int main()
{
  int cock = 0;
  int hen = 0;
  int chicken = 0;

  for (cock = 0; cock <= 20; cock++) //外层循环控制公鸡数量取值范围0~20
  {
      for (hen = 0; hen <= 33; hen++) //中层循环控制母鸡数量取值范围0~30
      {
          for (chicken = 0; chicken <= 100; chicken++) //内层循环控制小鸡数量取值范围0~100
          {
              //在内外层循环条件控制下小鸡数量的取值限制用难一组解的合理性
              if ((5*cock + 3*hen + chicken/3.0 == 100) && (cock + hen + chicken == 100))
              {
                  printf("cock=%2d, hen=%2d, chicken=%2d\n", cock, hen, chicken);
              }
          }
      }
  }
  return 0;
}

运行结果

详解C语言处理算经中著名问题百钱百鸡

 

5. 算法优化

以上算法需要穷举尝试 21 ∗ 34 ∗ 101 = 72114 21 *34*101=72114 21∗34∗101=72114 次,算法的效率明显太低了。 对于本题来说,公鸡的数量确定后,小鸡的数量就是固定为 100 − c o c k − h e n 100-cock-hen 100−cock−hen,无须进行穷举了。 此时约束条件就只有一个: 5 ∗ c o c k + 3 ∗ h e n + c h i c k e n / 3 = 100 5*cock+3*hen+chicken/3=100 5∗cock+3∗hen+chicken/3=100。 这样我们利用两重循环即可实现。

详解C语言处理算经中著名问题百钱百鸡

此算法只需尝试 21 ∗ 34 = 714 21 * 34 = 714 21∗34=714 次,实现时约束条件中限定了chicken必须能被3整除。 只有chicken能被3整除时才会继续进行约束条件 5 ∗ c o c k + 3 ∗ h e n + c h i c k e n / 3 = 100 5*cock+3*hen+chicken/3=100 5∗cock+3∗hen+chicken/3=100 的判断。 这样省去了chicken不能被3整除时需要进行的算术计算和条件判断,进一步提高了算法的效率。

到此这篇关于详解C语言处理算经中著名问题百钱百鸡的文章就介绍到这了,更多相关C语言 百钱百鸡内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_63325890/article/details/122977976?spm=1001.2014.3001.5502

延伸 · 阅读

精彩推荐
  • C/C++C语言随机加密程序的实现方法

    C语言随机加密程序的实现方法

    下面实例是对C语言随机加密程序的实现方法。需要的朋友参考下...

    C语言教程网3182020-11-25
  • C/C++浅谈QT内存泄漏

    浅谈QT内存泄漏

    本文主要介绍了浅谈QT内存泄漏,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    yhl_sophia3922022-01-11
  • C/C++C++类成员构造函数和析构函数顺序示例详细讲解

    C++类成员构造函数和析构函数顺序示例详细讲解

    这篇文章主要介绍了C++类成员构造和析构顺序示例,看了这个例子大家就可以明白c++构造析构的奥秘...

    C++教程网5242021-01-10
  • C/C++C++中进行txt文件读入和写入的方法示例

    C++中进行txt文件读入和写入的方法示例

    这篇文章主要给大家介绍了C++中进行txt文件读入和写入的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,...

    Williamhzw7612021-08-02
  • C/C++C++实现合并排序的方法

    C++实现合并排序的方法

    这篇文章主要介绍了C++实现合并排序的方法,实例分析了合并排序的原理与相关实现技巧,需要的朋友可以参考下...

    Jack_Wong20105392021-03-04
  • C/C++C++中stringstream的用法和实例

    C++中stringstream的用法和实例

    下面小编就为大家带来一篇C++中stringstream的用法和实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C++教程网10832021-04-22
  • C/C++C语言的指针类型详细解析

    C语言的指针类型详细解析

    C语言的指针类型包括两方面的信息:一是地址,存放在指针变量中;二是类型信息,关乎于读写的长度,没有存储在指针变量中,位于用该指针读写时的...

    C语言教程网11962020-12-29
  • C/C++C++实现控制台随机迷宫的示例代码

    C++实现控制台随机迷宫的示例代码

    本文主要介绍了C++实现控制台随机迷宫的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Icys10392021-12-21