Viết hàm tính lũy thừa nhanh khi gặp các số lớn pascal
1 câu trả lời
uses crt;
type lstring = ansistring;
int = longint;
var a:lstring;
n:int;
function nhan(a,b:lstring):lstring;
var ans:lstring;
res:array[0..1000000] of int;
i,j,l:int;
begin
ans:='';
l:=length(a) + length(b);
fillchar(res, sizeof(res), 0);
for i:=length(a) downto 1 do
for j:=length(b) downto 1 do
res[i + j]:=res[i + j] + (ord(a[i]) - 48) * (ord(b[j]) - 48);
for i:=l downto 1 do
begin
res[i - 1]:=res[i - 1] + (res[i] div 10);
res[i]:=res[i] mod 10;
end;
for i:=0 to l do ans:=ans + chr(res[i] + 48);
while (ans[1] = '0') and (length(ans) > 1) do
delete(ans, 1, 1);
exit(ans);
end;
function pow(a:lstring; n:int): lstring;
var tmp:lstring;
begin
if (n = 0) then exit('1');
tmp:=pow(a, n shr 1);
tmp:=nhan(tmp, tmp);
if (n and 1 = 1) then exit(nhan(a, tmp));
exit(tmp);
end;
begin
clrscr;
readln(a);
readln(n);
writeln(pow(a,n));
readln;
end.
