C语言趣味编程之平分七筐鱼

 更新时间:2021年11月25日 17:23:12   作者:小辉_Super  
这篇文章介绍了C语言趣味编程之平分七筐鱼,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

题目描述

甲、乙、丙三位渔夫出海打鱼,他们随船带了21只箩筐。当晚返航时,他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐则是空的,由于他们没有秤,只好通过目测认为7个满筐鱼的重量是相等的,7个半筐鱼的重量是相等的。在不将鱼倒出来的前提下,怎样将鱼平分为3份?

分析

这题还有两个隐形要求:三个人分得的箩筐数量相同(7只);列出所有的平分方法。

我的思路(参照网上他人方法)

首先,所有的鱼所占的箩筐数为7+7*0.5=10.5只(7只满筐和7只半筐),将它们平分成3份,那么每个人就能分到3.5只装满鱼的箩筐(例如3只满筐和1只半筐或者1只满筐5只半筐等等)。

我们可以先遍历出甲分到的装满鱼的箩筐数,然后再遍历出乙分到的装满鱼的箩筐数,丙的满筐鱼箩筐数则为7-甲乙的满筐鱼的箩筐数之和。由于最后每个人都能分到3.5筐鱼,所以他们最多可分配3只装满鱼的箩筐。

确定完他们的满筐鱼箩筐数之后,接着遍历甲乙分到的半筐鱼箩筐数,丙分到的半筐鱼箩筐数则等于7-甲乙的半筐鱼的箩筐数之和。由于目前他们分到的满筐鱼的箩筐数为整数,而最终他们都必须分得3.5筐鱼,所以每个人至少要分到一只装有半筐鱼的箩筐,且一定是奇数只。

在分配完半筐鱼的箩筐后,如果每个人所分到的鱼的箩筐数为3.5(其实判断甲乙即可),那么说明该分配方式符合条件。

最后,每个人空筐的箩筐数=7-该人的满筐鱼箩筐数-该人的半筐鱼箩筐数。

我的代码还有一些可优化的地方(可以删去一些无效的循环次数),在网上参考部分有一个很不错的例子(我的思路和代码就参考了该例子)。

代码实现

#include <stdio.h>

int main()
{
    //甲乙丙分得的不同类型箩筐数量
    int fish_nums[3][3] = {0};
    int i = 0, j = 0, k = 0, m = 0, n = 0;

    //甲分满箩筐,最大3筐
    for(i = 0; i <= 3; i++)
    {
        fish_nums[0][0] = i; //甲分得满箩筐数
        //乙分满箩筐,最大三筐
        for(j = 0; j <= 3; j++)
        {
            fish_nums[1][0] = j;         //乙分得满箩筐数
            fish_nums[2][0] = 7 - i - j; //丙分得满箩筐数
            if(fish_nums[2][0] > 3)
                continue;                //超过3.5框

            //甲分奇数个半箩筐,最少1个,最多5个(其他人也要分)
            for(k = 1; k <= 5; k+=2)
            {
                if(fish_nums[0][0] + 0.5 * k == 3.5)
                    break;
            }
            fish_nums[0][1] = k;         //甲分得半箩筐数

            //乙分奇数个半箩筐,最少1个,最多5个(其他人也要分)
            for(m = 1; m <= 5; m+=2)     //乙分奇数个半箩筐
            {
                if(fish_nums[1][0] + 0.5 * m == 3.5)
                    break;
            }
            fish_nums[1][1] = m;         //乙分得半箩筐数
            fish_nums[2][1] = 7 - k - m; //丙分得半箩筐数

            //甲分得空箩筐数
            fish_nums[0][2] = 7 - fish_nums[0][0] - fish_nums[0][1];
            //乙分得空箩筐数
            fish_nums[1][2] = 7 - fish_nums[1][0] - fish_nums[1][1];
            //丙分得空箩筐数
            fish_nums[2][2] = 7 - fish_nums[2][0] - fish_nums[2][1];

            //打印匹配的结果
            for(n = 0; n < 3; n++)
            {
                if(n == 0)
                    printf("甲——");
                else if(n == 1)
                    printf("乙——");
                else printf("丙——");
                printf("满筐:%d,半筐:%d,空筐:%d\n", fish_nums[n][0],\
                        fish_nums[n][1], fish_nums[n][2]);
                if(n == 2)
                    printf("-------------------------------------\n");
            }
        }
    }
    return 0;
}

运行结果

由于我考虑了针对甲乙丙三个不同的人的分法,所以最后结果有6个,如果不考虑三个人的身份,那么分法还需要除以3,即只有2种(具体代码可以参考下文的网上参考部分)

网上参考

原文链接:http://c.biancheng.net/cpp/html/3370.html

核心思路

  • (1) 数组的每行或每列的元素之和都为7。
  • (2) 对数组的行来说,满筐数加半筐数=3.5。
  • (3) 每个人所得的满筐数不能超过3筐。
  • (4) 每个人都必须至少有1个半筐,且半筐数一定为奇数。
#include<stdio.h>
int a[3][3], count;
int main()
{
    int i, j, k, m, n, flag;
    printf("It exists possible distribtion plans:\n");
    for(i=0; i<=3; i++)  /*试探第一个人满筐a[0][0]的值,满筐数不能>3*/
    {
        a[0][0]=i;
        for(j=i; j<=7-i&&j<=3; j++)  /*试探第二个人满筐a[1][0]的值,满筐数不能>3*/
        {
            a[1][0]=j;
            if((a[2][0]=7-j-a[0][0])>3)
                continue;  /*第三个人满筐数不能>3*/
            if(a[2][0]<a[1][0])
                break;  /*要求后一个人分的满筐数大于等于前一个人,以排除重复情况*/
            for(k=1; k<=5; k+=2)  /*试探半筐a[0][1]的值,半筐数为奇数*/
            {
                a[0][1]=k;
                for(m=1; m<7-k; m+=2)  /*试探半筐a[1][1]的值,半筐数为奇数*/
                {
                    a[1][1]=m;
                    a[2][1]=7-k-m;
                    /*判断每个人分到的鱼是 3.5筐,flag为满足题意的标记变量*/
                    for(flag=1,n=0; flag&&n<3; n++)
                        if(a[n][0]+a[n][1]<7&&a[n][0]*2+a[n][1] == 7)
                            a[n][2]=7-a[n][0]-a[n][1];  /*计算应得到的空筐数量*/
                        else
                            flag=0;  /*不符合题意则置标记为0*/
                    if(flag)
                    {
                        ++count;
                        printf("No.%d Full basket Semi-basket Empty\n", count);
                        for(n=0; n<3; n++)
                            printf(" fisher %c: %d %d %d\n",'A'+n, a[n][0], a[n][1], a[n][2]);
                    }
                }
            }
        }
    }
    return 0;
}

原文结果:

以上所述是小编给大家介绍的C语言趣味编程之平分七筐鱼,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Matlab绘制散点密度图的教程详解

    Matlab绘制散点密度图的教程详解

    这篇文章主要介绍了如何使用MATLAB绘制散点密度图(二维核密度),文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下
    2022-02-02
  • C语言中字符串常用操作总结

    C语言中字符串常用操作总结

    C语言是一种非常流行的编程语言,它支持各种数据类型,包括整数、浮点数、字符和字符串等,本文将介绍 C语言中字符串的相关知识,包括字符串的定义、初始化、赋值等,需要的可以参考一下
    2023-05-05
  • C++超详细讲解RTTI和cast运算符的使用

    C++超详细讲解RTTI和cast运算符的使用

    RTTI(Runtime Type Identification)是“运行时类型识别”的意思。C++引入这个机制是为了让程序在运行时能根据基类的指针或引用来获得该指针或引用所指的对象的实际类型,cast强制转换运算符是一种特殊的运算符,它把一种数据类型转换为另一种数据类型
    2022-08-08
  • 提高C程序效率的10种有效方法

    提高C程序效率的10种有效方法

    本文向你介绍规范你的C代码的10种方法。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • C++中strstr函数的实现方法总结

    C++中strstr函数的实现方法总结

    这篇文章主要介绍了C++中strstr函数的实现方法总结的相关资料,希望通过本文能帮助到大家,让大家掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • C语言解决百钱买百鸡问题

    C语言解决百钱买百鸡问题

    本文给大家分享的是一个经典的算法(百元百鸡)的C语言版的解决方法,使用的是比较偷懒的穷举法,有需要的小伙伴可以参考下。
    2016-02-02
  • C语言实现简单通讯录系统

    C语言实现简单通讯录系统

    这篇文章主要为大家详细介绍了C语言实现简单通讯录系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C++构建函数使用介绍

    C++构建函数使用介绍

    构造函数主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用;析构函数主要作用在于对象销毁前系统自动调用,执行一 些清理工作
    2022-08-08
  • C语言中的数组和指针汇编代码分析实例

    C语言中的数组和指针汇编代码分析实例

    这篇文章主要介绍了C语言中的数组和指针汇编代码分析实例,本文用一则C语言例子来得到对应的汇编代码,并一一注解每句汇编代码的含义,需要的朋友可以参考下
    2015-06-06
  • C语言之实现单链表指定结点的插入方式

    C语言之实现单链表指定结点的插入方式

    这篇文章主要介绍了C语言之实现单链表指定结点的插入方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论