右シフトや最下位ビットのチェックなどの操作を効率的に実行できるように、大きな基数 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
、その中のN^N
に相当する1 followed by N zero
ということです。たとえば - 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);
}
現在、この関数には 2 つの大きな問題があります。
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 の数値を表す方法を探しています。誰もそのようなことに遭遇したことがありますか?または、この問題を効率的に解決する他の方法を知っている人はいますか?