DigCtr TJ

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 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值