jos*_*osh 8 c c++ math exponentiation
如何确定取幂的前n位数(a b).
eg: for a = 12, b = 13 & n = 4, the first 4 digits are 1069.
Run Code Online (Sandbox Code Playgroud)
Ale*_*tov 20
通过以下迭代计算b:
a 1 = a 1,
a 2 = a 2,
...
a i = a i,
...
a b = a b
你有一个i + 1 = a i ×a.Calcluate每一个我不完全是.事情是,相对误差一个b小于Ñ的倍相对误差一个.
您希望最终相对误差小于10 -n.因此,每个步骤的相对误差可能是.删除每一步的最后一位数字.
例如,a = 2,b = 16,n = 1.最终相对误差为10 -n = 0.1.每个步骤的相对误差为0.1/16> 0.001.因此,每个步骤的3个数字很重要.如果n = 2,则必须保存4位数.通用规则:每步保存[ n + log 10 b ]个数字.
2(1),4(2),8(3),16(4),32(5),64(6),128(7),256(8),512(9),1024(10)→ 102,
204(11),408(12),816(13),1632(14)→163,326(15),652(16).
答案:6.
该算法具有O(b)的复杂性.但很容易将其更改为O(log b)
小智 5
另一个解决方案,使用 log10:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char **argv) {
int a = 12;
int b = 13;
int n = 4;
double x, y;
x = b * log10(a);
y = floor(pow(10, x - floor(x) + n - 1));
printf("Result: %d\n", (int)y);
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)