您的位置:首页 > 编程语言

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

2006-03-24 00:13 369 查看
确实好久没更新了……花功夫去做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的编剧越来越大胆了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: