Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program n_1;
- uses crt;
- var a, n, b : array of integer;
- function DelZero(a: array of integer): array of integer;
- var i: integer;
- begin
- for i:= Length(a)-1 downto 1 do
- if a[i] = 0 then SetLength(a, Length(a)-1)
- else break;
- if Length(a) = 1 then
- begin
- setLength(a, 2);
- a[1] := 0;
- end;
- result := a;
- end;
- function LongRead(): array of integer;
- var a: array of integer;
- i, n: integer;
- s: string;
- label 1;
- begin
- 1: setlength(a, 0);
- readln(s);
- n:=length(s)+1;
- setlength(a, n);
- for i:=1 to Length(s) do
- begin
- if not integer.TryParse(s[i], a[n-i]) then Goto 1;
- a[length(s)-i+1] := strtoint(s[i]);
- end;
- a := DelZero(a);
- result := a;
- end;
- function LongShortMult(LI : array of integer; SI : integer): array of integer;
- var LTemp: array of integer;
- CarryOver, TempCarryOver: integer;
- i :integer;
- begin
- CarryOver := 0;
- SetLength(LTemp, Length(LI));
- for i:= 1 to Length(LI)-1 do
- begin
- LTemp[i]:= (LI[i] * SI + CarryOver) MOD 10;
- CarryOver := CarryOver div 10 + (LI[i]*SI) DIV 10;
- end;
- if CarryOver > 0 then
- begin
- TempCarryOver := CarryOver;
- while TempCarryOver > 0 do
- begin
- SetLength(LTemp, Length(LTemp)+1);
- LTemp[Length(LTemp)-1]:= TempCarryOver mod 10;
- TempCarryOver := TempCarryOver div 10;
- end;
- end;
- lI:= lTemp;
- result := LTemp;
- end;
- procedure LongWrite(LI: array of integer);
- var i: integer;
- begin
- LI := DelZero(LI);
- for i:=length(LI)-1 downto 1 do
- write(LI[i]);
- if Length(LI) = 1 then write('0');
- writeln;
- end;
- function LongDiv2(LI : array of integer): array of integer; // Только для четных
- var LTemp: array of integer;
- CarryOver, i: integer;
- begin
- SetLength(LTemp, length(LI));
- CarryOver := 0;
- for i:=length(LI)-1 downto 1 do
- begin
- LTemp[i] := (CarryOver * 10 + LI[i]) div 2 ;
- CarryOver := LI[i] mod 2;
- end;
- if LTemp[length(LI)-1] = 0 then
- SetLength(LTemp, length(LI)-1);
- LTemp := DelZero(LTemp);
- Result := LTemp;
- end;
- procedure LongDec(LI: array of integer);
- var i, j: integer;
- label 1;
- begin
- for i:=1 to Length(LI)-1 do
- if LI[i]>0 then
- begin
- for j:= 1 to i-1 do LI[j]:=9;
- dec(lI[i]);
- break;
- end;
- LI := DelZero(LI);
- end;
- function LongMax(LI1, LI2: array of integer) : array of integer; // проверить
- var i: integer;
- begin
- LI1 := DelZero(LI1);
- LI2 := DelZero(LI2);
- if Length(LI1) > Length(LI2) then result := LI1
- else if Length(LI1) < Length(LI2) then result := LI2
- else If Length(LI1) = Length(LI1) then
- begin
- for i:= Length(LI1)-1 downto 1 do
- if LI1[i] > LI2[i] then
- begin
- result := LI1;
- break;
- end
- else
- if LI1[i] < LI2[i] then
- begin
- result := LI2;
- break;
- end
- else result := LI1;
- end;
- end;
- function LongLongPlus(LI1, LI2 : array of integer) : array of integer;// проверить
- Var LTemp : array of integer;
- CarryOver, i, Len: integer;
- begin
- Len := Length(LongMax(LI1, LI2))+1;
- SetLength(LI1, Len);
- SetLength(LI2, Len);
- SetLength(LTemp, Len);
- for i:= 1 to Length(LTemp)-1 do
- begin
- LTemp[i] := (LI1[i] + LI2[i]) mod 10 + CarryOver;
- CarryOver := (LI1[i] + LI2[i]) div 10;
- end;
- if CarryOver > 0 then
- begin
- SetLength(LTemp, Length(LTemp)+1);
- LTemp[Length(LTemp)-1] := CarryOver;
- end;
- LTemp := DelZero(LTemp);
- Result := LTemp;
- end;
- function LongLongPlusX10(LI, LIx10: array of integer): array of integer; // проверить
- var LTempX10, LTemp: array of integer;
- i: integer;
- begin
- SetLength(LTempX10, Length(LIx10)+1);
- LTempX10[1] := 0;
- For i:= Length(LTempX10)-1 downto 1 do
- begin
- LTempX10[i] := LIx10[i-1];
- end;
- LTemp := LongLongPlus(LTempX10, LI);
- result := LTemp;
- end;
- function LongLongMult(LI1, LI2: array of integer): array of integer; // учусь умножать ☺
- var LTemp: array of integer;
- i: integer;
- begin
- SetLength(LTemp, Length(LI1) + Length(LI2) + 1);
- LTemp := LongShortMult(LI1, LI2[Length(LI2)-1]);
- for i := Length(LI2) - 2 downto 1 do
- begin
- LTemp := LongLongPlusX10(LongShortMult(LI1, LI2[i]) ,LTemp);
- end;
- LTemp := DelZero(LTemp);
- result := LTemp;
- end;
- begin
- a := LongRead; // НЕ ПРОЙДЕН ТЕСТ 3, 27.
- n := LongRead;
- SetLength(b, 2);
- b[1] := 1;
- while (n[1] > 0) or (Length(n) > 2) do
- begin
- writeln('n = ', n,' a = ',a);
- if n[1] mod 2 = 0 then
- begin
- n := LongDiv2(n);
- a := LongLongMult(a, a);
- end
- else
- begin
- LongDec(n);
- b := LongLongMult(b, a);
- end;
- end;
- LongWrite(b);
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement