在1s内求2的N次方(n小于等于50000),位运算+快速幂+高精度,pasca
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
var
k,n,i,j,top:longint;
a,b:array[0..30000] of longint; procedure mul;
var
i,j:longint;
a:array[0..30000] of longint; begin
fillchar(a,sizeof(a),0);
for i:=1 to top do
for j:=1 to top do
a[i+j-1]:=a[i+j-1]+b[i]*b[j]; for i:=1 to top*2-1 do
b[i]:=a[i];
top:=top*2-1;
for j:=1 to top-1 do
begin
b[j+1]:=b[j] div 10+b[j+1];
b[j]:=b[j] mod 10;
end;
while b[top]>=10 do
begin
b[top+1]:=b[top] div 10;
b[top]:=b[top] mod 10;
inc(top);
end;
end;
begin
readln(n);
i:=0;
while n>0 do
begin
inc(i);
a[i]:=n mod 2;
n:=n div 2;
end;
top:=1;
b[1]:=1;
k:=i;
for i:=k downto 1 do
begin
mul;
if a[i]=1 then
begin
for j:=1 to top do
b[j]:=b[j]*2;
for j:=1 to top-1 do
begin
b[j+1]:=b[j] div 10+b[j+1];
b[j]:=b[j] mod 10;
end;
while b[top]>=10 do
begin
b[top+1]:=b[top] div 10;
b[top]:=b[top] mod 10;
inc(top);
end;
end;
end;
for i:=top downto 1 do
write(b[i]);
writeln;
end.