Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:
注意:
- 加号与等号各自需要两根火柴棍
- 如果A≠B,则 A+B=C 与 B+A=C 视为不同的等式(A,B,C>=0)
- n根火柴棍必须全部用上
来源:洛谷 www.luogu.com.cn/problem/P11…
输入格式
一个整数n(n<=24)。
18
输出格式
一个整数,能拼成的不同等式的数目。
9
二、思路分析:
- 使用火柴棒拼等式, 我们只要把数字对应的火柴棒个数记录,看看既满足等式又满足火柴棒个数的等式有哪些即可,例如拼 0 需要6根火柴棒、 拼1需要2根火柴棒......拼11需要4根火柴棒.......
- 因为n<=24, 又1只需要2根火柴棒,可以得知最大的等式也就1111+1=1112,还超出了24根, 这里注意 + 号和 = 号各需要2根火柴棒,所以我们只要求出 0~1111需要的火柴棒个数即可
- 将求出的火柴棒数存到数组中,这样我们求 i 的火柴棒数就直接取 b[i] , 求 j 的火柴棒数就直接取 b[j] ,求 i+j 的火柴棒数就直接取 b[i+j]
三、AC 代码:
import java.util.Scanner;
public class Main {
// count 统计合适的等式个数
static int count = 0;
public static void main(String[] args) {
Scanner sr = new Scanner(System.in);
int n = sr.nextInt();
// 0~9 的数字火柴棒个数
int[] a = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
int[] b = new int[2001];
// 由于我们分解数字需要用到一个条件while (t != 0) ,所以我们先给 b[0]赋好值
b[0] = 6;
// 1~2000的火柴棒个数
for (int i = 1; i < 2001; i++) {
int t = i;
while (t != 0) {
b[i] += a[t % 10];
t = t / 10;
}
}
// 搜索
for (int j = 0; j < 1000; j++)
for (int k = 0; k < 1000; k++) {
if (b[j] + 2 + b[k] + 2 + b[j + k] == n) {
count++;
}
}
System.out.println(count);
}
}
四、总结:
很简单的一道搜索题,主要就是我们需要先把 0~1111 数字需要的火柴棒个数算出来(这里直接求到了2000),再进行一个判断,不要忘记 + 和 = 也需要火柴棒哦