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

    快速幂可以节省大量计算时间

    两种方式  递归和迭代 通常需要取模避免溢出

    1.递归

    #define Mod 100000
    int quick(int a,int n)
    {
        if(n==0)
            return 1;
        else if(n%2==1)
        {
            return quick(a,n-1)*a%Mod;
        }
        else 
        {
            int temp = quick(a,n/2)%Mod;
            return temp*temp%Mod;
        }
    }

    2,迭代

    为了方便理解,从最初开始优化

    例如 7^5 = (7^4)*(7^1) 

    4不断除2

     = (49^2)*(7^1)

     得到结果

    比循环计算速度快,幂越大,速度差距越明显

    #define Mod 100000
    int quick(int a,int n)
    {
        int result = 1;//结果
        while(n>0)//幂次直到为0停止
        {
            if(n%2==0)//次幂为偶数
            {
                n = n/2;
                a=a*a%Mod;  //相当于上文(7^4)中4变2,底数为49  
    
            }
            else//奇数先乘a,计算偶次幂的结果
            {
                n = n-1;
                result = a*result%Mod; //对应上文 (7^5)中先乘7将5减一变偶数
                n = n/2;
                a=a*a%Mod;
            }
        
        }
      return result; }

    合并简化代码

    #define Mod 100000
    int quick(int a,int n)
    {
        int result = 1;
        while(n>0)
        {
            if(n%2==1)
            {
                result = a*result%Mod;
            }    
                n = n/2; 
                a=a*a%Mod;
    
        }
        return result;
    }

    下列小小简化下

    int quick(int a,int n)
    {
        int result = 1;
        while(n)
        {
            if(n&1) //n%2==1 判断为奇数
            {
                result*=a;
            }
         n>>1;//n = n/2 a
    *=a; }
      return result; }
  • 相关阅读:
    数字图像处理领域就业前景
    opencv 学习方法
    学习opencv tutorials
    win64+VS2010+OPENCV2.4.9配置问题
    libsvm使用步骤
    生成libSVM的数据格式及使用方法
    一堆应该记住的概念
    static静态变量的理解
    C程第一节课
    扫雷但是不会恭喜
  • 原文地址:https://www.cnblogs.com/9527s/p/13209107.html
Copyright © 2011-2022 走看看