火柴棍等式

问题描述:

现在小明有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;
} 

时间: 2024-10-12 23:50:33

火柴棍等式的相关文章

火柴棍等式问题

首先确定每个数字所用的火柴棍树木,用一层递归一层循环枚举一次,确定两个加数的值,算出和,进行进行判断,若符合条件则进行记录. 1 #include<cstdio> 2 int need[]={6,2,5,5,4,5,6,3,7,6}; 3 int ans=0;int h=0; 4 int n; 5 int ab[1000]; 6 int cnt(int cur){ 7 int ans=0,ret; 8 if(cur==0) return 6; 9 while(cur>0){ 10 ret

TYVJ P1012 火柴棒等式 Label:枚举

背景 NOIP2008年提高组第二题 描述 给你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. n根火柴棍必须全部用上 输入格式 输入文件matches.in共一行,又一个整数n(n<=24). 输出格式 输出文件matches.out共一行,表示能拼成的不同等

noip2008 火柴棒等式

P1149 火柴棒等式 1.9K通过 3.7K提交 题目提供者该用户不存在 标签搜索/枚举模拟2008NOIp提高组 难度普及- 提交该题 讨论 题解 记录 题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自需要两根火柴棍 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0) n根火柴棍必须全部用上 输入输出格式 输入格式: 输入

Vijos P1496 火柴棒等式 【NOIP2008提高组第二题】

题目链接:https://vijos.org/p/1496 题目大意: 给你n(n<24)根火柴棍,你可以拼出多少个形如“A+B=C”的等式?("+"和"="各自需要两根火柴棍) 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0) n根火柴棍必须全部用上 题目思路: 其实这题很水,n最大才24,扣掉+和=就只有20,直接枚举就行. 稍微算一下就知道每个数最大不会超过1111 两层for枚举每个数,判断是否用尽火柴即可. 1 // 2

P1149 火柴棒等式

P1149 火柴棒等式 4.6K通过 8.6K提交 题目提供者该用户不存在 标签 NOIp提高组 2008 云端 难度 普及- 时空限制 1s / 128MB 题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0) .用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自需要两根火柴棍 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0) n根火柴棍必须全部用上 输入输出格

火柴棍移动的一道面试题

最近有朋友找工作,面试某公司,遇到一个火柴棍移动的面试题,感觉有点意思,在此抛砖引玉. 题目大致是这样的: 一个三个数的式子,移动其中一根火柴,使等式成立,用程序或实现(可以用伪码),输出能成立的等式. 注:"+"可以移走一根火柴变成"-" 例如: 废话不说,直接上代码,哪位网友有更好的方法,请分享一下,多谢 #include <stdio.h> /* 定义操作符号,"+"或"-" */ #define SYMBO

P1016 [NOIP2008T2]火柴棒等式 - Smart Online Judge

不罗嗦,简单暴力枚举,由于输入规模比较小,希望能有更好的算法. 题目ID:1016 题目名称:[NOIP2008T2]火柴棒等式 有效耗时:932 ms 空间消耗:1872 KB 程序代码: 1 import java.util.Scanner; 2 3 4 public class Main { 5 static int[] a={6,2,5,5,4,5,6,3,7,6,2,2}; 6 7 static int getsum(int n){ 8 int sum=0; 9 for(int i=0

1168 火柴棒等式

1168 火柴棒等式 链接:http://codevs.cn/problem/1168/ 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 1. 加号与等号各自需要两根火柴棍 2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C

洛谷-火柴棒等式-NOIP2008提高组复赛

题目描述 Description 给你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. n根火柴棍必须全部用上 输入输出格式 Input/output 输入格式: 输入文件matches.in共一行,又一个整数n(n<=24). 输出格式: 输出文件mat