先说说整指数乘方,百度上搜到一个程序,效率很高,代码简洁:
int pow(int x,int n)
{
int temp(x),res(1);
while(n)
{
if(n&1)
{
res *= temp;
}
temp *= temp;
n>>=1;
}
return res;
}
把2^61代入运算,内存变化图是这样的:61的二进制形式是111101
res = 2 2 32 8192 536870912 2.305843009213693952E18
temp= 4 16 256 65536 4294967296 1.8446744073709551616E19
2.305843009213693952E18 是最终结果 除红色部分外有9次是关键乘法,前两个红色 2 2近似不占运算时间,后面红色1.8446744073709551616E19是冗余运算。
我的源程序和上述算法效率差不多,因构思不一样,也贴出来,以x^61为例:
Dim a(50) As Integer
i = 0
Do
yCzs3 = yCzs.Zx(1) Mod 2 ‘yCzs.Zx(1)中存放的是指数
If yCzs3 = 0 Then
yCzs.Zx(1) = yCzs.Zx(1) / 2
a(i) = 1
Else
yCzs.Zx(1) = yCzs.Zx(1) - 1
a(i) = 0
End If
yCzs3 = yCzs.Zx(1)
i = i + 1
Loop While yCzs.Zx(1) <> 1 '等于一退出 ’循环完成后a()的内存情况为: 011010101
For j = i - 1 To 0 Step -1 ‘一共需要9次乘法
If a(j) = 1 Then
zCzs1 = myMULTIPLY(zCzs1, zCzs1) ’ zCzs1的初始值是x,myMULTIPLY()函数是大数乘
Else
zCzs1 = myMULTIPLY(zCzs1, zCzs2) ’ zCzs2的初始值是x
End If
Next
我的思路是这样的:x^61=((((((((x^2)*x)^2)*x)^2)*x)^2)^2)*x
来源:CSDN
作者:落叶无情
链接:https://blog.csdn.net/qq_34030789/article/details/51699489