Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 有没有快速的方法来确定n^n上的前k位_Algorithm_Numerical Methods - Fatal编程技术网

Algorithm 有没有快速的方法来确定n^n上的前k位

Algorithm 有没有快速的方法来确定n^n上的前k位,algorithm,numerical-methods,Algorithm,Numerical Methods,我正在写一个程序,我只需要知道另一个大数字的前k(k可以是1-5)个数字,可以表示为n^n,其中n是一个非常大的数字 目前,我实际上正在计算n^n,然后将其解析为字符串。我想知道是否有更好更快的方法存在 如果您指的是最低有效位或最右边的数字,这可以通过模乘实现。它是O(N)复杂度,不需要任何特殊的bignum数据类型 #include <cmath> #include <cstdio> //returns ((base ^ exponent) % mod) int mo

我正在写一个程序,我只需要知道另一个大数字的前k(k可以是1-5)个数字,可以表示为n^n,其中n是一个非常大的数字


目前,我实际上正在计算n^n,然后将其解析为字符串。我想知道是否有更好更快的方法存在

如果您指的是最低有效位或最右边的数字,这可以通过模乘实现。它是O(N)复杂度,不需要任何特殊的bignum数据类型

#include <cmath>
#include <cstdio>

//returns ((base ^ exponent) % mod)
int modularExponentiation(int base, int exponent, int mod){
    int result = 1;
    for(int i = 0; i < exponent; i++){
        result = (result * base) % mod;
    }
    return result;
}

int firstKDigitsOfNToThePowerOfN(int k, int n){
    return modularExponentiation(n, n, pow(10, k));
}

int main(){
    int n = 11;
    int result = firstKDigitsOfNToThePowerOfN(3, n);
    printf("%d", result); 
}

有两种可能性

如果需要前k个前导数字(如:12345的前导数字为1),则可以使用以下事实:

n^n = 10^(n*Log10(n))
因此,您计算
n*Log10(n)
的分数部分
f
,然后
10^f
的前k位将是您的结果。如果使用双精度,在四舍五入错误开始出现之前,这适用于10^10左右的数字。例如,对于
n=2^20
f=0.57466709…
10^f=3.755494…
,所以前5位是37554。对于
n=4
f=0.4082…
10^f=2.56
,您的第一个数字是2

如果需要前k个尾随数字(如:12345的尾随数字是5),则可以使用模运算。我会使用平方技巧:

factor = n mod 10^k
result = 1
while (n != 0) 
    if (n is odd) then result = (result * factor) mod 10^k
    factor = (factor * factor) mod 10^k
    n >>= 1

再以n=2^20为例,我们发现
result=88576
。对于n=4,我们有
因子=1,4,6
结果=1,1,6
,所以答案是6。

哪个数字是“第一位”?一位数?你能举例说明吗?是的。看看这个近似值……有一个算法可以进行任何幂运算:例如n=4k=1,那么答案是2,6(因为4^4=256)。无意冒犯,但你的幂运算算法效率有点低。。它可以从现在的O(exp)降到O(log(exp))。另外,
pow
返回浮点/双倍,也可以使用您自己的modexp,对吗?(只需将mod设置为1@harold,你是对的,我们可以做得比O(N)更好。我花了一段时间才记住a^(2C)=(a^C)^2,这为我们提供了一个很好的快捷方式。是的,现在看起来好多了,你也可以用一个简单的循环(如Jeffrey的答案)来计算前k个前导数字,这更清楚它说了什么。
n^n = 10^(n*Log10(n))
factor = n mod 10^k
result = 1
while (n != 0) 
    if (n is odd) then result = (result * factor) mod 10^k
    factor = (factor * factor) mod 10^k
    n >>= 1