笔记:高精代码关键语句总结

来源:互联网 发布:四川广电网络成都公网 编辑:程序博客网 时间:2024/05/30 23:53

    确实好久没更新了……花功夫去做Vijos了,一天2道……
    把去年重庆选拔赛的那个最小公倍数做了,把高精代码贴在这里供大家瞻仰。
    每种运算都开了a、b、c三个数组,a、b是输入的要算的数,c是返回的结果。按惯例,数组倒序存字串,就是说a[1]表示的个位。

加法:
c[i]:=c[i]+a[i]+b[i];
c[i+1]:=c[i] div 10;
c[i]:=c[i] mod 10;


减法(默认了a比b大):
if a[i]<b[i] then
begin
  dec(a[i+1],1);
  inc(a[i],10);
end;
c[i]:=a[i]-b[i];


乘法:
inc(c[i+j-1],a[i]*b[j]);
inc(c[i+j],c[i+j-1]div 10);
c[i+j-1]:=c[i+j-1]mod 10;


除法有点复杂,需要调用前面的三种运算。算法和人做竖式计算一样,模拟试商。
简单说一下:

    始终保持两个变量直到最后返回,一个当前得数,一个当前余数。初始化得数为0,余数为被除数。然后不断用当前的余数去减除数,同时当前得数不断跟着加1。
    当除数远远小于被除数时,这种方法显然效率很低。为了能一次减很多,可以在每次减之前试商以减去尽可能大的整数倍的除数。试商方法很简单,先搜i再搜j,搜索小于当前余数的最大的“除数*j*10^i”。然后当前余数减去除数*j*10^i,得数加j*10^i。反复这个过程,直到余数小于除数。可以看到,对j的枚举即是试商的过程。

代码写出来不难,十几行搞定。


24的编剧越来越大胆了。

原创粉丝点击