SSL P2151 西行寺幽幽子___高精度

题目大意:

在幻想乡,西行寺幽幽子是以贪吃闻名的亡灵。他决定去收集人间的春度,聚集起来让西行妖开花。很快,作为幽幽子家园艺师的魂魄妖梦收集到了M个单位的春度。并且在这段时间里,幽幽子计算出要让西行妖开出一朵花需要N个单位的春度。现在幽幽子想要知道,使用所有的春度,能够让西行妖开出多少朵花。

N,M的位数不超过L
对于60%的数据:L <= 2,000且ans <= 2,000
对于100%的数据:L <= 20,000且ans <= 2,000,000,000

题解:

显然裸的高精度除法
不会高精度除法的我给个

传送门

代码:

const
    n=30001;
    type
       arr=array [0..n] of longint;

var
    a,b,c:arr;
    st1,st2:ansistring;
    l1,l2,i,j:longint;

procedure work;
  var
    i,j,k,g,s:longint;
begin
    j:=1;

    i:=1;
    while (i<n) and (a[i]=b[i]) do inc(i);

    while a[i]>=b[i] do
      begin

        inc(j);
        for i:=2 to n do
          begin
            b[i-1]:=b[i];
            b[i]:=0;
          end;

        i:=1;
        while (i<n) and (a[i]=b[i]) do inc(i);

      end;

    while j>0 do
      begin
        i:=1;
        while (i<n) and (a[i]=b[i]) do inc(i);
        while a[i]>=b[i] do
          begin
                   k:=n-j+1;
                   g:=0;
                   s:=0;
                   c[k]:=c[k]+1;
                   for i:=k downto 1 do
                     begin
                          s:=c[i]+g;
                          g:=s div 10;
                          c[i]:=s mod 10;
                     end;
                   g:=0;
                   for i:=n downto 1 do
                     if a[i]>=b[i]+g
                        then begin
                                 a[i]:=a[i]-b[i]-g;
                                 g:=0;
                             end
                        else begin
                                 a[i]:=10+a[i]-b[i]-g;
                                 g:=1;
                             end;
                   i:=1;
                   while (i<n) and (a[i]=b[i]) do inc(i);
          end;
          j:=j-1;
          for i:=n downto 2 do
             begin
                   b[i]:=b[i-1];
                   b[i-1]:=0;
             end;
      end;
end;

begin
       readln(st1);
       readln(st2);
       l1:=length(st1);
       l2:=length(st2);
       for i:=1 to l1 do
          a[n-l1+i]:=ord(st1[i])-48;
       for i:=1 to l2 do
          b[n-l2+i]:=ord(st2[i])-48;
       work;
       j:=1;
       while (j<n) and (c[j]=0) do inc(j);
       for i:=j to n do write(c[i]);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值