实验课.简单数学(基本数学题)

基本数学题

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了一片)
对于本题:对于这种题第一印象一定是遍历xxxxxxxxxxxx*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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值