X^n的算法
三种方法的原理都是一样的
对于n,先将其换成二进制形式,在这里举个例子,假设n=11,其二进制形式是1011
从左边数的第二位开始,若等于0,则对x进行平方,若为1,则先对当前结果进行平方,再乘上x。
Description
给定整数x和n,求x的n次幂 mod 1003
Input
整数x和n。 1<=x,n<=1,000,000,0000
Output
x^n mod 1003
Sample Input
2 10
Sample Output
21
方法一
#include<stdio.h>
#define MAXSIZE 10000
int main()
{
int a[MAXSIZE];
long long int n,x,y,m;
int key=0;
scanf("%d%d",&x,&n);
while(n!=0)
{
a[key]=n%2;
n=n/2;
key++;
} //把n由十进制化为二进制,并且存入数组a[]中
m=key-2;//由最高位的下一位开始判断,为1还是为0
y=x%1003;
for(int k=0; k<key-1; k++)
{
x=x%1003; //在提交时,开始没有写这一句,显示Wrong Answer,加上该句,提交成功!
if(a[m]==0)//为0,只进行平方
{
y=y*y%1003;
}
else if(a[m]==1)//为1先在当前数的基础上进行平方,然后乘上x
{
y=y*y*x%1003;
}
m--;
}
printf("%d",y%1003);
return 0;
}
方法二
eg:计算2^11
211=21*22*23
(11)2=(1011)2
result=1;
while(n!=0)
{
if(n%2)
result = result*x; //若等于1,结果乘上x
n=n/2;
x=x*x //需要注意,不管n%2的结果是1还是0,都要先对其进行平方,若结果为1,在result的基础上再乘上x
}
方法三
递归法
X^n可以分成三种情况
1.X,n=1;
2.X^(n/2),n>1,n%2=1;
3.X^(n/2),n>1,n%2=0;
int pow(x,n)
{
if(n==1)
return x; //结束语句
y=pow(x,n/2);
if(n%2==1)
return y*y*x;
else
return y*y;
}
在任何情况下,递归程序都可以转换成非递归程序,即由系统建栈转换为自己建栈。