数据结构:Quick Power

The function Power calculates the exponential function N​k​​. But since the exponential function grows rapidly, you are supposed to return (N​k​​)%10007 instead.

Format of function:

int Power(int N, int k);

Both N and k are integers, which are no more than 2147483647.

Sample program of judge:

#include <stdio.h>

int Power(int, int);

const int MOD = 10007;
int main()
{
    int N, k;
    scanf("%d%d", &N, &k);
    printf("%d\n", Power(N, k));		
    return 0;
}

/* Your function will be put here */

Sample Input 1:

2 3

Sample Output 1:

8

Sample Input 2:

128 2

Sample Output 2:

6377

分析:

此题考察快速幂方法,使用方法为:(ab) mod c 等价于 (a mod c)b mod c,推导我没有推出来(推导流程可以参考我下面附上的链接),不过这个可以直接作为一个公式使用,在降低时间复杂度上十分有用。

实现:

1.递归方法:

int Power(int N, int k)
{
    N %= MOD;
    if (k == 0)
        return 1;
    if (k > 0) {
        if (k % 2 == 1)
        {
            return N * Power(N, k - 1) % MOD;
            k /= 2;
        }
        else
        {
            k /= 2;
            return Power(N, k)*Power(N, k) % MOD;
        }
    }
}

2.非递归方法:

int Power(int N, int k)
{
    int n = 1;
    N = N % MOD;
    while (k > 0) {
        if (k % 2 == 1)
            n = n * N % MOD;
        k /= 2;
        N = N * N % MOD;
    }
    return n;
}

实际上,非递归适用性更广一些,如果k比较大的话,递归方法其实是比较耗时间的,因为内部要不断递归,才能得到那个较大的k的结果,但非递归方法却能很好的解决这个问题。我自己写的时候只想到了递归的方法,虽然这个也能解决每一个样例点,但在以后解决时间复杂度的时候还是需要多运用非递归方法

非递归方法我参考的是大佬的博客,链接如下:
https://blog.csdn.net/anniewwy/article/details/83869888

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值