pascal中火柴棒等式问题。

来源:百度知道 编辑:UC知道 时间:2024/05/28 18:12:59
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根火柴棍必须全部用上
我不要程序,只要思路方法说明!!! 如何枚举所有等式?

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

先预处理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.

好难