高精度数的定义:
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-1、N。一开始天使们站在编号为N的宝盒旁。她们各自手上都有一个数字,代表她们自己的发言稿所在的盒子是从1号盒子开始按顺时针方向的第几个。例如:有7个盒子,那么如果TENSHI手上的数字为9,那么她的发言稿所在盒子就是第2个。现在天使们开始按照自己手上的数字来找发言稿,先找到的就可以先发言。TENSHI一下子就找到了,于是她最先上台宣誓:“我将带领大家开启NOI之门……”TENSHI宣誓结束以后,陆续有天使上台宣誓。可以有一位天使找了好久都找不到她的发言稿,原来她手上的数字M非常大,她转了好久都找不到她想找的宝盒。
【问题求解】
请帮助这位天使找到她想找的宝盒的编号。
【输入格式】
从文件YUBIKILI.IN的第一、二行分别读入正整数N和M,其中N、M满足
2 ≤ N ≤ 108,2 ≤ 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.