码迷,mamicode.com
首页 > 其他好文 > 详细

高精包

时间:2015-10-14 12:12:30      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:

var x,y:ansistring;
    a,b:array[1..11000]of int64;
    c:array[1..35000]of int64;
    num:array[1..11000] of longint;
    i,j,lena,lenb,lenc,len:longint;

procedure init;
begin
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
fillchar(c,sizeof(c),0);
end;

function compare(s1:string;s2:string):boolean;
var len1,len2:longint;

begin
len1:=length(s1);
len2:=length(s2);
if ((len1<len2)or(len1=len2) and (s2>s1))then
        compare:=true
else
        compare:=false;
end;


procedure input;
begin
readln(x);
len:=length(x);
lena:=len div 5;
for i:=1 to len do
        num[i]:=ord(x[len-i+1])-48;
for i:=1 to lena do
        a[i]:=num[5*i]*10000+num[5*i-1]*1000+num[5*i-2]*100+num[5*i-3]*10+num[5*i-4];
if ((len mod 5)<>0) then
        begin
                inc(lena);
                for i:=1 to (len mod 5) do
                  a[lena]:=a[lena]*10+num[len-i+1];
        end;
readln(y);
len:=length(y);
lenb:=len div 5;
for i:=1 to len do
        num[i]:=ord(y[len-i+1])-48;
for i:=1 to lenb do
        b[i]:=num[5*i]*10000+num[5*i-1]*1000+num[5*i-2]*100+num[5*i-3]*10+num[5*i-4];
if ((len mod 5)<>0) then
        begin
                inc(lenb);
                for i:=1 to (len mod 5) do
                  b[lenb]:=b[lenb]*10+num[len-i+1];
        end;
end;

procedure print;
begin
write(c[lenc]);
for i:=lenc-1 downto 1 do
   begin
      if (c[i] = 0) then
         write(00000)
      else
        if (c[i]<10) then
         write(0000,c[i])
      else
        if (c[i]<100) then
         write(000,c[i])
      else
        if (c[i]<1000) then
         write(00,c[i])
      else
        if (c[i]<10000) then
         write(0,c[i])
      else
        write(c[i]);
   end;
end;

procedure plus;
begin
fillchar(c,sizeof(c),0);
if (lena>lenb) then
   lenc:=lena+1
else
   lenc:=lenb+1;
for i:=1 to lenc do
        begin
                c[i]:=a[i]+b[i]+c[i];
                c[i+1]:=c[i+1]+c[i] div 100000;
                c[i]:=c[i] mod 100000;
        end;
while ((c[lenc]=0) and (lenc<>1)) do dec(lenc);
print;
end;

procedure mui;

begin
fillchar(c,sizeof(c),0);
for i:=1 to lena do
        for j:=1 to lenb do
                c[i+j-1]:=c[i+j-1]+a[i]*b[j];
for i:=1 to lena+lenb-1 do
        if (c[i]>9999) then
                begin
                        c[i+1]:=c[i+1]+c[i] div 100000;
                        c[i]:=c[i] mod 100000;
                end;
lenc:=lena+lenb;
while ((c[lenc]=0) and (lenc<>1)) do dec(lenc);
print;
end;


procedure sub;
begin
fillchar(c,sizeof(c),0);
if compare(x,y) then
   begin
        write(-);
        for i:=1 to lenb do
            begin
                  b[i]:=b[i]-a[i];
                  b[i+1]:=b[i+1]+ord(b[i]>=0)-1;
                  b[i]:=b[i]+ord(b[i]<0)*100000;
                  c[i]:=b[i];
            end;
        lenc:=lenb;
   end
else
   begin
        for i:=1 to lena do
            begin
                  a[i]:=a[i]-b[i];
                  a[i+1]:=a[i+1]+ord(a[i]>=0)-1;
                  a[i]:=a[i]+ord(a[i]<0)*100000;
                  c[i]:=a[i];
            end;
        lenc:=lena;
   end;
while ((c[lenc]=0) and(lenc>1)) do dec(lenc);
print;
end;


procedure division;
begin
1.正向存入数组
2.一直比较试除,直到最后一位
(要改大框架,所以就直接说思想了)
end
; //main begin while not eof do begin init; input; plus; writeln; sub; writeln; mui; writeln; end; end.

 

高精包

标签:

原文地址:http://www.cnblogs.com/sorhri/p/gj.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!