zoukankan      html  css  js  c++  java
  • 快速幂

    快速幂是很快速求幂函数的方法。

    用普通方法时间复杂度是O(n),而快速幂的时间复杂度是log(n),但n很大时,时间会明显的得到提升。

    下面是模板:

     1 ll get_pow(ll x, ll n){
     2     ll ans = 1;
     3     while(n){
     4         if(n&1){
     5             ans = x*ans;
     6         }
     7         x = x*x;
     8         n/=2;
     9     }
    10     return ans;
    11 }

    不过,但我看到快速幂的推导时,我想到了用递归来做,代码量小,而且更容易理解。

    下面是我写的递归模板:

    1 ll get_pow(ll x, ll n){
    2     if(n == 1) return x;
    3     if(n&1) return x*get_pow(x*x,n/2);
    4     else return get_pow(x*x,n/2);
    5 }

    下面贴一道相关的题目:

    lcy gives a hard puzzle to feng5166,lwg,JGShining and Ignatius: gave a and b,how to know the a^b.everybody objects to this BT problem,so lcy makes the problem easier than begin.
    this puzzle describes that: gave a and b,how to know the a^b's the last digit number.But everybody is too lazy to slove this problem,so they remit to you who is wise.
     
    Input
    There are mutiple test cases. Each test cases consists of two numbers a and b(0<a,b<=2^30)
     
    Output
    For each test case, you should output the a^b's last digit number.
     
    Sample Input
    7 66
    8 800
     
    Sample Output
    9
    6
     
    题目是求a^b的个位数是多少
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #define ll long long
     4 using namespace std;
     5 ll get_pow(int x, int n){
     6     if(n == 1) return x;
     7     if(n&1) return x*get_pow((x*x)%10,n/2);
     8     else return get_pow((x*x)%10,n/2);
     9 }
    10 int main(){
    11     ll a, b;
    12     while(~scanf("%lld%lld",&a,&b)){
    13         cout << get_pow(a%10,b)%10<<endl;
    14     }
    15     return 0;
    16 }
  • 相关阅读:
    c++ const的使用
    C++面向对象程序设计举例
    C++构造函数与析构函数的解析
    inline函数和一般的函数有什么不同
    Linux 脚本为什么会有#!
    Linux 基本概念和操作2
    Linux 基本概念和操作
    ubuntu14.0464位 Ros环境 安装halcon13.01
    数据类型之间的连接和运算
    cmd命令 从C盘转到D盘
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/6616947.html
Copyright © 2011-2022 走看看