偶数次幂可以拆解,这样利用位运算,二进制末尾1的是奇数,末尾0的是偶数,因此每次就是幂指数除以2(n>>1等价,便于理解),如果奇书就单独乘一个。
大概就是这个意思,可以减少乘法运算次数。
typearrty=array[1..10000] of longint
var
n,mn,len,lenm,i,mnl:longint
a,m:arrty
procedure mxm
var
c:arrty
i,j:longint
begin
fillchar(c,sizeof(c),0)
for i:=1 to lenm do
for j:=1 to lenm do
begin
inc(c[i+j-1],m[i]*m[j])
inc(c[i+j],c[i+j-1] div 10)
c[i+j-1]:=c[i+j-1] mod 10
end
lenm:=lenm+lenm+1
while (lenm>1) and (c[lenm]=0) do
dec(lenm)
for i:=1 to lenm do
m[i]:=c[i]
end
procedure axm
var
c:arrty
i,j:longint
begin
fillchar(c,sizeof(c),0)
for i:=1 to len do
for j:=1 to lenm do
begin
inc(c[i+j-1],a[i]*m[j])
inc(c[i+j],c[i+j-1] div 10)
c[i+j-1]:=c[i+j-1] mod 10
end
len:=len+lenm+1
while (len>1) and (c[len]=0) do
dec(len)
for i:=1 to len do
a[i]:=c[i]
end
begin
fillchar(a,sizeof(a),0)
readln(mn,n)
mnl:=mn
len:=0
while mnl>0 do
begin
inc(lenm)
m[lenm]:=mnl mod 10
mnl:=mnl div 10
end
a[1]:=1
len:=1
while n>0 do
begin
if n mod 2=1 then
axm
n:=n div 2
mxm
end
for i:=len downto 1 do
write(a[i])
writeln
end.
不清楚你说的这个算法不过单从运行上看,第二个参数b初始为3,运行过程中永远是3,于是无限递归,最终爆栈了,这个是错误的原因
建议检查一下b%2的分支,和你算法是否有不符的地方