• 火柴棍等式


    一、问题描述

    现在小明有n根火柴棍,希望拼出如 A+B=C 的等式。等式中的A、B、C均是用火柴棍拼出来的整数(若该数非零,则最高位不能是0)。数字0~9的拼法如图所示:

    注意:

    1. 加号与等号各自需要两根火柴棍。
    2. 如果 A≠B ,则 A+B=C 与 B+A=C 视为不同的等式(A、B、C都大于0)。
    3. 所有的火柴棍必须全部用上。

    假如现在小明手上有m根(m ≤ 24)火柴棍,那么小明究竟可以拼出多少个不同的形如 A+B=C 的等式呢?

    二、题目分析

    1,既然要找出形如A+B=C这样的等式,那最简单的办法就是分别枚举。

    2,又因为题目中最多只有24根火柴,除去“+”和“=”占用的4根火柴棍,那么最多剩下20根火柴棍。

    3,在0~9这10个数字中,我们可以看到数字1需要用到的火柴棍最少,只需要2根火柴棍。所以20根火柴棍最多能组成10个1。

    4,因此在 A+B=C 这个等式A、B、C中的任意一个数都不能超过1111。(这个结论很关键!)

    5,接下来我们只需要分别来枚举A、B、C,范围都是0~1111。

    6,A所使用的火柴棍的根数加上B所使用的火柴棍的根数,再加上C所使用的火柴棍的根数,如果恰好等于m-4的话,则成功地找出了一组等式。

    7,或者我们只需要枚举A和B就可以了,C可以通过A+B算出来。(优先采用这个)

    三、代码如下

    #include<stdio.h>
    int fun(int x)//用来计算一个数所需要用火柴棍的总数
    {
        int num=0;  //用来计数的变量,所以需要初始化
        int f[10]={6,2,5,5,4,5,6,3,7,6};  //用一个数组来记录0~9每个数字需要用多少根火柴棍
        while(x/10!=0)  //如果x/10的商不等于0,说明这个数至少有两位
        {
            num += f[x%10];  //获得x的末尾数字并将此数所需要用到的火柴棍根数累加到num中
            x=x/10;  //去掉x的末尾数字,例如x的值为123则现在x的值为12 
        } 
        num += f[x];  //最后加上此时x所需用到的火柴棍的根数(此时x一定是一位数)
        return num;  //返回需要火柴棍的总根数 
    }
    
    int main()
    {
        int a,b,c,m,sum=0;  //sum用来计数,因此要初始化
        scanf("%d",&m);  //读入火柴棍的个数
        /*开始枚举a和b*/
        for(a=0;a<=1111;a++)
        {
            for(b=0;b<=1111;b++)
            {
                c=a+b;  //计算出c
                if(fun(a)+fun(b)+fun(c)==m-4)
                {
                    printf("%d+%d=%d
    ",a,b,c);
                    sum++;
                } 
            }
        } 
        printf("一共可以拼出%d个不同的等式",sum);
        return 0;
    } 

     

  • 相关阅读:
    Compiling LIBFFM On OSX 10.9
    Linux shell 脚本入门教程+实例
    Understanding the Bias-Variance Tradeoff
    Learning How To Code Neural Networks
    MXNet设计和实现简介
    数据需求统计常用awk命令
    Deal with relational data using libFM with blocks
    MATLAB 在同一个m文件中写多个独立的功能函数
    Debug 路漫漫-06
    MATLAB 求两个矩阵的 欧氏距离
  • 原文地址:https://www.cnblogs.com/OctoptusLian/p/6785522.html
Copyright © 2020-2023  润新知