题解:洛谷 P1149 [NOIP 2008 提高组] 火柴棒等式

【题目来源】

洛谷:P1149 [NOIP 2008 提高组] 火柴棒等式 - 洛谷 (luogu.com.cn)

【题目描述】

给你 \(n\) 根火柴棍,你可以拼出多少个形如 \(A+B=C\) 的等式?等式中的 \(A\)\(B\)\(C\) 是用火柴棍拼出的整数(若该数非零,则最高位不能是 \(0\))。用火柴棍拼数字 \(0∼9\) 的拼法如图所示:

image

注意:

  1. 加号与等号各自需要两根火柴棍;
  2. 如果 \(A\neq B\),则 \(A+B=C\)\(B+A=C\) 视为不同的等式 \((A,B,C\ge 0)\)
  3. \(n\) 根火柴棍必须全部用上。

【输入】

一个整数 \(n(1\le n\le 24)\)

【输出】

一个整数,能拼成的不同等式的数目。

【输入样例】

14

【输出样例】

2

【解题思路】

image

【算法标签】

《洛谷 P1149 火柴棒等式》 #搜索# #NOIP提高组# #2008#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

// 定义每个数字(0-9)所需的火柴棒数量
int counts[10] = {6,2,5,5,4,5,6,3,7,6};

// 函数f(n): 计算数字n所需的火柴棒总数
int f(int n) 
{
    if (n==0) return 6; // 数字0需要6根火柴棒
    int ans=0;
    while (n!=0) 
	{
        ans += counts[n%10]; // 取出n的每一位数字,并累加对应的火柴棒数量
        n = n/10; // 去掉已经处理的最低位
    }
    return ans;
}

int main()
{
    int n, ans=0;
    cin >> n; // 输入总的火柴棒数量

    // 遍历所有可能的a和b(0到719)
    for (int a=0; a<720; a++) 
        for (int b=0; b<720; b++) 
		{
            // 检查等式 a + b = c 所需的火柴棒总数是否等于n
            // f(a) + f(b) + f(a+b) 是数字a、b和c(即a+b)的火柴棒总数
            // 4代表加号和等号所需的4根火柴棒(加号2根,等号2根)
            if (f(a)+f(b)+f(a+b)+4==n) ans++;
        }

    // 输出满足条件的等式数量
    cout << ans;
    return 0;
}

【运行结果】

14
2
posted @ 2026-02-17 16:06  团爸讲算法  阅读(14)  评论(0)    收藏  举报