C语言有关快速幂问题

Python013

C语言有关快速幂问题,第1张

原理就是n^4=(n^2)^2

偶数次幂可以拆解,这样利用位运算,二进制末尾1的是奇数,末尾0的是偶数,因此每次就是幂指数除以2(n>>1等价,便于理解),如果奇书就单独乘一个。

大概就是这个意思,可以减少乘法运算次数。

type

arrty=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的分支,和你算法是否有不符的地方