存储大型 B 基数的最佳方法是什么,以便可以有效地完成右移和检查最低有效位等操作?
实际上,我遇到了一个面试问题,上面写着
Given two numbers N and K such that 0<=N<=1000 and 0<=K<=1000^1000. I need
to check that whether N^N = K or not. For example:
if N=2 and K=4 , 2^2 = 4 so return true;
if N=3 and K=26 , 3^3 != 26 so return false
我在想的是,如果我考虑base N number system
, thenN^N
将相当于1 followed by N zero
in it。例如 - 对于 N = 2,2^2 = 100(以 2 为底),对于 N=3,3^3 = 1000(以 3 为底)。然后我可以轻松地编写一个函数来判断是否K = N^N
。
int check(unsigned long int N, unsigned long int K)
{
unsigned long int i;
for (i=0; i<N; i++)
{
if (K%N != 0) //checking whether LSB is 0 or not in base N number system
return 0;
K = K/N; //right shift K by one.
}
return (K==1);
}
现在这个函数有两个主要问题:
1) An unsigned long int is not sufficient to store large numbers of range 0
to 1000^1000.
2) The modulus and the division operations makes it every less efficient.
为了提高效率,我正在寻找某种方法来表示大的基数 N 数字,以便我可以有效地执行右移和检查最低有效位操作。有没有人遇到过这样的事情?或者有人知道有效解决这个问题的任何其他方法吗?