ある数のn次方のアルゴリズムを求めます(効率的です)
726 ワード
このアルゴリズムはある数のn次方を求める時間複雑度はlognしかなく,我々が普段使っているサイクル時間複雑度はo(n)である.
げんり
一般的にはa(2 x+b)=a 2 x*a b
だからある
(b=0の場合):a 2 x+b=(ax)2;
(b=1の場合):a 2 x+b=(a x)2*a;
anに対して、まずnのバイナリ表現を書き出して、それではあります
an = a (n1 n2 n3 n4 ..)(2) = …
左から右へは次の表のようになります(n=15の場合1111)
nのバイナリビット
1
1
1
1
累乗
a
a2 * a = a3
(a3)2 *a= a7
(a7)2 * a = a15
int power(int x,int n)
{
int m=0;
m=n;
int t=1;
while(m>0)
{
m/=2;
t*=2;
}
m=n;
int y=1;
while(t>1)
{
t/=2;
y*=y;
if (m>=t)
{
y*=x;
m-=t;
}
}
return y;
}
げんり
一般的にはa(2 x+b)=a 2 x*a b
だからある
(b=0の場合):a 2 x+b=(ax)2;
(b=1の場合):a 2 x+b=(a x)2*a;
anに対して、まずnのバイナリ表現を書き出して、それではあります
an = a (n1 n2 n3 n4 ..)(2) = …
左から右へは次の表のようになります(n=15の場合1111)
nのバイナリビット
1
1
1
1
累乗
a
a2 * a = a3
(a3)2 *a= a7
(a7)2 * a = a15