pascal中火柴棒等式问题。

2. 火柴棒等式 (matches.pas/c/cpp) 【问题描述】 给你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根火柴棍必须全部用上我不要程序,只要思路方法说明!!! 如何枚举所有等式?
2026年09月28日 06:57
有3个网友回答
网友(1):

先预处理0--2000所有数字的笔画数。
然后枚举所有情况。可以用数学证明不会出现2000以上的数字。
用一个双重循环实现
for i:=0 to 1000 do
for j:=0 to 1000 do
if data[i]+data[j]+data[i+j]=n then inc(tot);

附程序:
const bh:array ['0'..'9'] of longint=(6,2,5,5,4,5,6,3,7,6);
var data:array[0..2000] of longint;
i,j,n,tot:longint;st:string;
{main}
begin
fillchar(data,sizeof(data),0);
tot:=0;
for i:=0 to 2000 do
begin
str(i,st);
for j:=1 to length(st) do inc(data[i],bh[st[j]]);
end;
readln(n);
dec(n,4);
for i:=0 to 1000 do
for j:=0 to 1000 do
if data[i]+data[j]+data[i+j]=n then inc(tot);
writeln(tot);
end.

网友(2):

这道题NOIP时,我是搜出来怕超时然后打表的.
思路:枚举所有等式,计算火柴数,相等就inc(ans),注意优化!!!

网友(3):

好难