基本数学题
link.
算法:x^n
Description
问题很简单,求x^n.请编写pow()函数.
声明如下:
int pow(int x,int n,int p)
//pow的功能是实现x^n,最后1个参数p没有用。
系统会自动在程序的最后加上如下代码:
int main()
{
int x,n;
scanf("%d %d",&x,&n);
printf("%d\n",pow(x,n,1));
return 0;
}
Input
x和n 0 < x,n < 2^31-1
Output
x^n .最后结果小于 2^31-1
Sample Input
2 3
Sample Output
8
思路:首先对于这种后台添加代码的提醒、、题型或者其他的要求,首先要注意两点:
1.不要将后台代码也沾上;2.保证提交代码与后台代码中的函数名保持一致。(以前一直每当回事,直到CE了一片)
对于本题:对于这种题第一印象一定是遍历xxxxxxxx…xxxx*x;需要计算(n-1)次乘方,TLE;
1.
using namespace std;
const int maxn=10005;
int pow(int x,int n,int p)//x^n
{
int i,sum1=1,sum=1;
int m=n/10;
int k=n%10;
if(m>=1)
for(i=1;i<=10;i++)
sum1*=x;
for(i=1;i<=m;i++)
sum*=sum1;
for(i=1;i<=k;i++)
sum*=x;
return sum;
}
2.二分法int乘方(递归)
AC代码
int pow(int x,int n,int p)
{
if(n == 0) return 1;
ll mid = pow(x,n/2);
if(n%2)
{
return mid*mid*x;
}
else
{
return mid*mid;
}
return mid;
}
WA代码:
int pow(int x,int n,int p)
{
int sum=1;;
int m=n;
n/=2;
if(n==0)
{
for(int i=0; i<m; i++)
sum*=x;
}
else
{
int b;
sum=x;
while(n)
{
b=n%2;
sum=sum*sum;
if(b==1)
sum=sum*x;
n/=2;
}
}
return sum;
}