g( len, light) 函数推算:
g[0,0]:=
true;
for i:=
1
to N
do
for j:=
1
to
120
do
for k:=
0
to
9 do
g[ i,j ] := g[i,j]
or g[i-1, j - c[k] ];
n
function getBig(
var len, dig :
integer) :
boolean;
n
begin
n fx:=0;
n
for i:=1
to N
do
//
从低位到高位
n
begin
n fx := fx + c[ d[ i ] ];
//
原
X
的前
i
位电子管数
n
for j:=d[ i ]+1
to 9
do
//
比原
X
第
i
位大的数,从小到大
n
if (fx>=c[j])
and (g[ i-1, fx - c[ j ] ] )
then
n
begin len:=i; dig:=j; exit(
true);
//
找到最小的
n
end;
n
end;
n
exit (
false);
n
end;
n
procedure getMin(len, fx:
integer);
n
begin
n
for i:=len
downto 1
do
//
从高位到低位
n
begin
n
for j:=0
to 9
do
//
尽量小数字
n
if (fx>=c[j])
and (g[ i -1, fx - c[j] ] )
then
n break;
n ans[ i ] := j;
n fx := fx-c[j];
//
后面还有多少电子管
n
end;
n
end;
procedure
calc();
var
len, dig :
integer
;
begin
ans:=d;
if
getBig(len,dig)
then
begin
//如果在>X的Y,即不“环绕”
ans[len]:=dig;
getMin(len-1, fx-c[dig]);
yy:=0;
for
i:=N
downto
1
do
yy := yy*10 + ans[i];
Y:= yy - X;
end
else
begin
//如果“环绕”了
getMin(N, fx);
//求一个尽量小的
yy:=0; Y:=1;
for
i:=N
downto
1
do
begin
yy := yy*10 + ans[i];
Y := Y*10;
//求10^N
end
;
Y:= Y-X + yy;
end
;
end
;