{Организовать умножение длинных чисел,
представив длинное число в виде списка;
вычислить степень, используя такое представление.}
Program Sp_Ex1;
Type Uk = ^Zveno;
Tsifra = 0..9;
Zveno = Record
A : Tsifra;
B : Uk
End;
Chislo = Uk;
Var First, Second, Therd : Pointer;
A, B, C : Chislo;
S : String;
{Количество цифр в записи длинного числа}
Function Dlina(A : Pointer) : LongInt;
Var Vsp : LongInt;
K : Chislo;
Begin
K := A;
Vsp := 0;
While K <> Nil Do
Begin
Vsp := Vsp + 1;
K := K^.B
End;
Dlina := Vsp
End;
Procedure ReadI(A : Pointer; N : LongInt; Var C : Tsifra);
Var I : LongInt;
L : Chislo;
Begin
I := 1;
L := A;
While I <= N Do
Begin
C := L^.A;
I := I + 1;
L := L^.B
End;
End;
Procedure WriteI(Var A : Pointer; N : LongInt; C : Tsifra);
Var I : LongInt;
L : Chislo;
Begin
I := 1;
L := A;
While I < N Do
Begin
I := I + 1;
L := L^.B
End;
L^.A := C
End;
Procedure Vvod(S : String; Var K : Pointer);
Var L, M : Chislo;
Code, I : Integer;
Begin
New(K);
K := Nil;
New(L);
Val(S[1], L^.A, Code);
L^.B := K;
K := L;
I := 2;
While I <= Length(S) Do
Begin
M := L;
New(L);
Val(S[I], L^.A, Code);
L^.B := M^.B;
M^.B := L;
I := I + 1
End;
End;
{Вывод длинного числа на экран}
Procedure WriteDlinnoe(K : Pointer);
Var L : Chislo;
Begin
L := K;
While L <> Nil Do
Begin
Write(L^.A : 1);
L := L^.B
End;
WriteLn
End;
{Умножение длинных чисел, цифры которых хранятся в списке}
Procedure Multiplication(A, B : Pointer; Var C : Pointer);
Var L, M : Chislo;
Perenos, Perenos1 : Tsifra;
AA, BB, Cc : Tsifra;
I, J : LongInt;
Begin
New(C);
C := Nil;
For I := 1 To Dlina(B) Do
Begin
New(L);
L^.A := 0;
L^.B := C;
C := L;
End;
For I := 1 To Dlina(A) Do
Begin
Perenos := 0;
ReadI(A, Dlina(A) - I + 1, Aa);
For J := 1 To Dlina(B) Do
Begin
ReadI(B, Dlina(B) - J + 1, Bb);
ReadI(C, Dlina(C) - (I + J - 1) + 1, Cc);
Perenos1 := (Cc + Perenos + Bb * Aa) Div 10;
Cc := (Cc + Perenos + Bb * Aa) Mod 10;
Perenos := Perenos1;
WriteI(C, Dlina(C) - (I + J - 1) + 1, Cc);
End;
New(L);
L^.A := 0;
L^.B := C;
C := L;
WriteI(C, Dlina(C) - (I + J) + 1, Perenos);
End;
L := C;
While (L^.A = 0) And (L^.B <> Nil) Do
Begin
C := L^.B;
Dispose(L);
L := C
End;
End;
Function MensheRavno(A, B : Pointer) : Boolean;
Var M, N : Chislo;
Begin
M := A;
N := B;
If Dlina(A) < Dlina(B)
Then MensheRavno := True
Else Begin
While (M^.A = N^.A) And (M^.B <> Nil) Do
Begin
M := M^.B;
L := L^.B
End;
MensheRavno := M^.A <= N^.A
End;
End;
Procedure Add(Var S : Pointer);
Var Perenos : 0..1;
L : Chislo;
N : LongInt;
Begin
Perenos := 0;
L := S;
N := Dlina(S);
ReadI(S, N,
End;
Procedure Stepen(A, B : Pointer; Var C : Pointer);
Var L, M : Chislo;
I : Pointer;
Begin
New(C);
C := Nil;
New(L);
L^.A := 1;
L^.B := C;
C := L;
New(I);
I := Nil;
New(M);
M^.A := 1;
M^.B := I;
I := M;
While MensheRavno(I, B) Do
Begin
Multiplication(A, C, C);
Adding(I)
End;
End;
{Основная программа}
Begin
Write('Введите первое число:');
ReadLn(S);
Vvod(S, First);
{WriteDlinnoe(First);}
Write('Введите первое число:');
ReadLn(S);
Vvod(S, Second);
Stepen(First, Second, Therd);
WriteDlinnoe(Therd);
End.
Более подробно про списки и другие абстрактные типы данных можно прочесть в данном разделе.
© Шестаков А.П., 1999-2009