火柴棒等式
我只能想出以下代码,问号部分思路断了#include <iostream>
using namespace std;
int main()
{
int hcb={6,2,5,5,4,5,6,3,7,6};
int n;
cin>>n;
n-=4;
int t=n;
while(n){
???
for(int i=0;???;++i){
n-=hcb;
}
???
}
return 0;
}
题:
链接:https://code.xueersi.com/codeup/topic/list?tidan_id=27&problem_code=T0301710&package_name=CSP-J%E7%AE%97%E6%B3%95%E8%BF%9B%E9%98%B6 题目文字黏过来~ 不二如是 发表于 2025-4-19 17:01
题目文字黏过来~
题目描述
给你n根火柴棍,你可以拼出多少个形如A+B=C的等式?等式中的ABC是用火柴棍评出来的整数(若该数非零,则最高位不能为0)。用火柴棍拼数字0~9的拼法如图所示:
注意:
1、加号与等号各自取两根火柴棍
2、如果A≠B,则A+B=C与B+A=C视为不同的等式(A,B,C≥0)
3、n根火柴棍必须全部用上
Clipboard Image.png
输入描述
一个整数n(1≤n≤24)
输出描述
一个整数,能拼成的不同等式的数目
样例1
输入
14
输出
2
样例2
输入
18
输出
9
提示 player-none 发表于 2025-4-19 17:48
题目描述
给你n根火柴棍,你可以拼出多少个形如A+B=C的等式?等式中的ABC是用火柴棍评出来的整数(若该 ...
@Fishc 琅琊王朝 发表于 2025-04-22 20:27
player-none 发表于 2025-4-19 17:48
题目描述
给你 ...
根据题意,我们需要找出所有满足A+B=C的火柴棍等式。以下是详细步骤和代码实现:
思路分析
1. 火柴棍数量预处理:每个数字0-9对应的火柴棍数已知。
2. 生成合法数字:用BFS生成所有可能的合法数字(无前导零),并记录每个数字的火柴棍数量。
3. 枚举所有组合:遍历所有A和B的组合,计算C=A+B,检查是否满足等式条件。
# 每个数字0-9需要的火柴棍数量
match_counts =
def generate_valid_numbers(max_total):
from collections import deque
valid = {}
# 添加0
if match_counts <= max_total:
valid = match_counts
queue = deque()
# 初始化1-9
for digit in range(1, 10):
cnt = match_counts
if cnt <= max_total:
valid = cnt
queue.append((digit, cnt))
# BFS生成所有合法数字
while queue:
num, curr_cnt = queue.popleft()
for d in range(10):
new_num = num * 10 + d
add_cnt = match_counts
new_total = curr_cnt + add_cnt
if new_total > max_total:
continue
if new_num not in valid:
valid = new_total
queue.append((new_num, new_total))
return valid
n = int(input())
if n < 4 + 2*3:# 最小情况:A=1, B=1, C=2,总火柴2+2+5+4=13
print(0)
else:
max_total = n - 4# 总火柴数(A+B+C)
valid = generate_valid_numbers(max_total)
count = 0
numbers = list(valid.keys())
for a in numbers:
a_cnt = valid
for b in numbers:
b_cnt = valid
c = a + b
if c not in valid:
continue
total = a_cnt + b_cnt + valid
if total + 4 <= n:
count += 1
print(count)
代码说明
1. generate_valid_numbers函数:用BFS生成所有可能的合法数字,避免前导零。
2. 主逻辑:输入n后,先处理边界情况,再生成合法数字列表,最后枚举所有组合统计符合条件的等式数量。
提示:代码时间复杂度为O(M^2),M为合法数字数量,适用于n较小的情况。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 琅琊王朝 发表于 2025-04-22 20:27
player-none 发表于 2025-4-19 17:48
题目描述
给你 ...
def count_matches(x):
# 每个数字对应的火柴棍数量
digit_matches =
if x == 0:
return digit_matches
s = str(x)
# 检查前导零
if len(s) > 1 and s == '0':
return -1
total = 0
for c in s:
total += digit_matches
return total
def count_equations(n):
m = n - 4# A+B+C的火柴总数
if m < 0:
return 0
# 预生成有效数字及其火柴数
max_num = 20000# 经验值,覆盖大部分情况
valid_numbers = []
count_map = {}
for x in range(0, max_num + 1):
cnt = count_matches(x)
if cnt != -1:
valid_numbers.append(x)
count_map = cnt
res = 0
for A in valid_numbers:
cnt_a = count_map
if cnt_a > m:
continue
for B in valid_numbers:
cnt_b = count_map
if cnt_a + cnt_b > m:
continue
C = A + B
if C not in count_map:
continue
cnt_c = count_map
if cnt_a + cnt_b + cnt_c == m:
res += 1
return res
# 示例输入输出测试
n = int(input())
print(count_equations(n))
思路解析
1. 火柴数映射:每个数字0-9对应的火柴棍数量预先定义,例如1用2根,7用3根。
2. 前导零处理:若数字非零且以0开头(如01),则视为无效。
3. 预处理有效数字:生成所有可能的有效数字(0到20000),并记录它们的火柴棍数量。
4. 双层循环遍历:遍历所有可能的A和B组合,计算C=A+B,检查:
- A、B、C是否均为有效数字
- 火柴棍总数是否等于n-4
5. 时间复杂度优化:通过预计算和范围剪枝(如提前跳过超过火柴总数的组合)提升效率。
关键点
- 加号和等号固定消耗4根火柴,因此A+B+C的总火柴数为n-4。
- 数字非零时不能有前导零,例如01非法,但0合法。
- 暴力枚举时需合理设定数字上限(如20000),避免超时。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2025-4-22 20:45
思路解析
1. 火柴数映射:每个数字0-9对应的火柴棍数量预先定义,例如1用2根,7用3根。
c++
页:
[1]