前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >火柴棍等式

火柴棍等式

作者头像
Zoctopus
发布2018-06-04 11:15:49
1K0
发布2018-06-04 11:15:49
举报

一、问题描述

现在小明有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\n",a,b,c);
                sum++;
            } 
        }
    } 
    printf("一共可以拼出%d个不同的等式",sum);
    return 0;
} 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-04-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题描述
  • 二、题目分析
  • 三、代码如下
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档