高精度数的定义:
type arr=array[word]of 0..9;


1.高精度加法

procedure init;
var i:word;
begin
    readln(s1);readln(s2);
    if s1='0' then begin writeln(s2); halt; end;
    if s2='0' then begin writeln(s1); halt; end;
    la:=length(s1);lb:=length(s2);
    for i:=1 to la do a[la-i+1]:=ord(s1[i])-ord('0');
    for i:=1 to lb do b[lb-i+1]:=ord(s2[i])-ord('0');
end;{init}

procedure plus(a,b:arr; var c:arr);
var i,x:word;
begin
    fillchar(c,sizeof(c),0);
    i:=1;x:=0;
    while(i<=la)or(i<=lb)do
        begin
            x:=a[i]+b[i]+x div 10;
            c[i]:=x mod 10;
            inc(i);
        end;
    if x>=10 then begin lc:=i; c[i]:=1; end
    else lc:=i-1;
end;{plus}


2.高精度减法

procedure init;
var i:word;
begin
    readln(s1);readln(s2);
    if s1=s2 then begin writeln(0); halt; end;
    if(length(s1)<length(s2))or(length(s1)=length(s2))and(s1<s2)then
   begin write('-'); s:=s1; s1:=s2; s2:=s; end;
    la:=length(s1);lb:=length(s2);
    for i:=1 to la do a[la-i+1]:=ord(s1[i])-ord('0');
    for i:=1 to lb do b[lb-i+1]:=ord(s2[i])-ord('0');
end;{init}

procedure less(a,b:arr; var c:arr);
var i,j:word;
begin
    fillchar(c,sizeof(c),0);
    lc:=la;
    for i:=1 to lc do
        if a[i]<b[i] then
            begin
                j:=i+1;
                while a[j]=0 do begin a[j]:=9; inc(j); end;
                dec(a[j]);
                c[i]:=a[i]+10-b[i];
            end
        else c[i]:=a[i]-b[i];
    while(c[lc]=0)and(lc>1)do dec(lc);
end;{plus}


3.高精度乘法

procedure init;
var i:word;
begin
    readln(s1);readln(s2);
    if(s1='0')or(s2='0')then begin writeln(0); halt; end;
if(s1='1')then begin writeln(s2); halt; end;
if(s2='1')then begin writeln(s1); halt; end;
if(s1[1]='-')and(s2[1]<>'-')then begin write('-'); delete(s1,1,1); end;
if(s1[1]<>'-')and(s2[1]='-')then begin write('-'); delete(s2,1,1); end;
if(s1[1]='-')and(s2[1]='-')then begin delete(s1,1,1); delete(s2,1,1); end;
    la:=length(s1);lb:=length(s2);
    for i:=1 to la do a[la-i+1]:=ord(s1[i])-ord('0');
    for i:=1 to lb do b[lb-i+1]:=ord(s2[i])-ord('0');
end;{init}

procedure multiply(a,b:arr; var c:arr);
var i,j,x:word;
begin
    fillchar(c,sizeof(c),0);
    for i:=1 to la do
        begin
            x:=0;
            for j:=1 to lb do
                begin
                    x:=a[i]*b[j]+x div 10+c[i+j-1];
                    c[i+j-1]:=x mod 10;
                end;
            c[i+j]:=x div 10;
        end;
    lc:=la+lb;
    while(c[lc]=0)and(lc>1)do dec(lc);
end;{multiply}


4.高精度除以低精度

procedure init;
var i:word;
begin
    readln(s1);readln(b);
    la:=length(s1);
    for i:=1 to la do a[i]:=ord(s1[i])-ord('0');
end;{init}

procedure devide(a:arr;b:word;var c:arr);
var i,x:word;
begin
    fillchar(c,sizeof(c),0);
    x:=0;
    for i:=1 to la do
        begin
            c[i]:=(x*10+a[i])div b;
            x:=(x*10+a[i]) mod b;
        end;
    lc:=la;
    j:=1;
    while(c[j]=0)and(j<lc)do inc(j);
end;{devide}

4、阶乘和(sum.pas)

【问题描述】

已知正整数N(N<=100),设S=1!+2!+3!+...N!。其中"!"表示阶乘,即N!=1*2*3*……*(N-1)*N,如:3!=1*2*3=6。请编程实现:输入正整数N,输出计算结果S的值。

【输入样例】sum.in

4

【输出样例】sum.out

33

【参考程序】

//By LYLtim

type arr=array[word]of 0..9;

var n:byte;
    si:string;

procedure init;
begin
    assign(input,'sum.in');reset(input);
    readln(n);
    close(input);
end;{init}

function multiply(s1,s2:string):string;
var a,b,c:arr;
    la,lb,lc,i,j,x:word;
begin
    multiply:='';
    fillchar(a,sizeof(a),0);
    fillchar(b,sizeof(b),0);
    fillchar(c,sizeof(c),0);
    la:=length(s1);lb:=length(s2);
    for i:=1 to la do a[la-i+1]:=ord(s1[i])-ord('0');
    for i:=1 to lb do b[lb-i+1]:=ord(s2[i])-ord('0');
    for i:=1 to la do
        begin
            x:=0;
            for j:=1 to lb do
                begin
                    x:=a[i]*b[j]+x div 10+c[i+j-1];
                    c[i+j-1]:=x mod 10;
                end;
            c[i+j]:=x div 10;
        end;
    lc:=la+lb;
    while(c[lc]=0)and(lc>1)do dec(lc);
    for i:=lc downto 1 do multiply:=multiply+chr(ord(c[i])+ord('0'));
end;{multiply}

function plus(s1,s2:string):string;
var a,b,c:arr;
    la,lb,lc,i,x:word;
begin
    plus:='';
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
    fillchar(c,sizeof(c),0);
    la:=length(s1);lb:=length(s2);
    for i:=1 to la do a[la-i+1]:=ord(s1[i])-ord('0');
    for i:=1 to lb do b[lb-i+1]:=ord(s2[i])-ord('0');
    i:=1;x:=0;
    while(i<=la)or(i<=lb)do
        begin
            x:=a[i]+b[i]+x div 10;
            c[i]:=x mod 10;
            inc(i);
        end;
    if x>=10 then begin lc:=i; c[i]:=1; end
    else lc:=i-1;
    for i:=lc downto 1 do plus:=plus+chr(ord(c[i])+ord('0'));
end;{plus}

procedure work;
var i,j:byte;
    sj,ss:string;
begin
    si:='0';
    for i:=1 to n do
        begin
            sj:='1';
            for j:=1 to i do
                begin
                    str(j,ss);
                    sj:=multiply(sj,ss);
                end;
            si:=plus(si,sj);
        end;
end;{work}

procedure print;
var i:word;
begin
    assign(output,'sum.out');rewrite(output);
    writeln(si);
    close(output);
end;{print}

begin{main}
    init;
    work;
    print;
end.

5、高精度求积(MULTIPLY.PAS)

【问题描述】

输入两个高精度正整数M和N(M和N均小于100位)。

【问题求解】

求这两个高精度数的积。

【输入样例】MULTIPLY.IN

36

3

【输出样例】MULTIPLY.OUT

108

【参考程序】

//By LYLtim

type arr=array[word]of 0..9;

var s1,s2:string;
    a,b,c:arr;
    la,lb,lc:word;

procedure init;
var i:word;
begin
    assign(input,'multiply.in');reset(input);
    assign(output,'multiply.out');rewrite(output);
    readln(s1);readln(s2);
    close(input);
    if(s1='0')or(s2='0')then begin writeln(0); close(output); halt; end;
if(s1='1')then begin writeln(s2); close(output); halt; end;
if(s2='1')then begin writeln(s1); close(output); halt; end;
if(s1[1]='-')and(s2[1]<>'-')then begin write('-'); delete(s1,1,1); end;
if(s1[1]<>'-')and(s2[1]='-')then begin write('-'); delete(s2,1,1); end;
if(s1[1]='-')and(s2[1]='-')then begin delete(s1,1,1); delete(s2,1,1); end;
    la:=length(s1);lb:=length(s2);
    for i:=1 to la do a[la-i+1]:=ord(s1[i])-ord('0');
    for i:=1 to lb do b[lb-i+1]:=ord(s2[i])-ord('0');
end;{init}

procedure multiply(a,b:arr; var c:arr);
var i,j,x:word;
begin
    fillchar(c,sizeof(c),0);
    for i:=1 to la do
        begin
            x:=0;
            for j:=1 to lb do
                begin
                    x:=a[i]*b[j]+x div 10+c[i+j-1];
                    c[i+j-1]:=x mod 10;
                end;
            c[i+j]:=x div 10;
        end;
    lc:=la+lb;
    while(c[lc]=0)and(lc>1)do dec(lc);
end;{multiply}

procedure print;
var i:word;
begin
    for i:=lc downto 1 do write(c[i]);
    close(output);
end;{print}

begin{main}
    init;
    multiply(a,b,c);
    print;
end.

6、天使的起誓(YUBIKILI.pas)

【问题描述】

TENSHI非常幸运的被选为掌管智慧之匙的天使。在正式任职之前,她必须和其他新当选的天使一样,要宣誓。宣誓仪式是每位天使各自表述自己的使命,她们的发言稿被放在N个呈圆形排列的宝盒中。这些宝盒按顺时针方向被编上号码1、2、3……、N-1N。一开始天使们站在编号为N的宝盒旁。她们各自手上都有一个数字,代表她们自己的发言稿所在的盒子是从1号盒子开始按顺时针方向的第几个。例如:有7个盒子,那么如果TENSHI手上的数字为9,那么她的发言稿所在盒子就是第2个。现在天使们开始按照自己手上的数字来找发言稿,先找到的就可以先发言。TENSHI一下子就找到了,于是她最先上台宣誓:“我将带领大家开启NOI之门……”TENSHI宣誓结束以后,陆续有天使上台宣誓。可以有一位天使找了好久都找不到她的发言稿,原来她手上的数字M非常大,她转了好久都找不到她想找的宝盒。

【问题求解】

请帮助这位天使找到她想找的宝盒的编号。

【输入格式】

从文件YUBIKILI.IN的第一、二行分别读入正整数NM,其中NM满足

  2 ≤ N ≤ 1082 ≤ M ≤ 101000

【输出格式】

把所求宝盒的编号输出到文件YUBIKILI.OUT,文件只有一行(包括换行符)。

样例一

YUBIKILI.IN

YUBIKILI.OUT

7

9

2

样例二

YUBIKILI.IN

YUBIKILI.OUT

11

108

9

【参考程序】

//By LYLtim

var n,x:longword;
    m:ansistring;
    la,i:word;
    a:array[1..1001]of 0..9;
begin
    assign(input,'yubikili.in');reset(input);
    assign(output,'yubikili.out');rewrite(output);
    readln(n);readln(m);
    la:=length(m);
    for i:=1 to la do a[i]:=ord(m[i])-ord('0');;
    x:=0;
    for i:=1 to la do x:=(x*10+a[i])mod n;
    if x=0 then writeln(n) else writeln(x);
    close(input);close(output);
end.

posted on 2011-08-05 10:48  shallyzhang  阅读(261)  评论(0)    收藏  举报