zoukankan      html  css  js  c++  java
  • 剑指 Offer 16. 数值的整数次方

    题目

    剑指 Offer 16. 数值的整数次方

    我的思路

    很明显,这里考的也就是“快速求幂”法。其中有二分思想。

    虽然是二分法,但这里不用left和right来确定上下界,而是用幂次的2进制表示的右移操作>>以及与操作&来实现快速求幂!

    套路:

    exponent = i0*2^0+i1*2^1+...+i(n-1)*2^(n-1)

    base^exponent = base^(i0*2^0)  *  base^(i1*2^1)  *  base^(i2*2^2)  *...

    当剩余幂次>0时:

      幂次最低位若是1,那么结果累乘上当前幂;若是0,无操作;

      更新当前幂:更新方法,当前幂自己平方。

      幂次右移1位;

    我的实现

    class Solution {
    public:
        double myPow(double x, int n) {
            long longn = n;
            if(x == 1 || n ==0) return 1;
            if(longn<0){
                longn = longn * (-1);
                x = 1/x;
            }
            double result = 1;
            while (longn){
                if (longn & 1) result = result * x;
                x = x * x;
                longn = longn>>1;
            }
            return result; 
        }
    };
    /*
    不用考虑大数问题是什么意思??
    快速求幂?
    待优化!快速求幂套路写法
    优化前的代码如下:
    class Solution {
    public:
        double myPow(double x, int n) {
            int ci = 1;
            vector<double> tools;
            tools.push_back(1);
            long n1 = n;
            if(n<0){
                x = 1/x;
                n1 = -n1;
            }
            double cd = x;
            if(n1>0||n1<0) 
            tools.push_back(x);
            while(n1-ci>ci){
                cd = cd * cd;
                ci = 2 * ci;
                tools.push_back(cd);
                std::cout<<ci<<"	"<<cd<<endl;
               // x^n==(x^(n/2))^2
            }
            
            int r = tools.size()-1;
            cd = 1;
            cout<<"r:"<<r<<"	tools:"<<tools[r]<<endl;
            while(n1!=0){
                while(n1<ci){
                    ci = ci/2;
                    --r;
                }
                n1 = n1 - ci;
                cd = tools[r] * cd;
            }
            return cd;
            /*if(n==0)return 1;
            if(n>0) 
            {
                if(n)
            }return myPow(x,n-1)*x;
            else return myPow(x,n+1)/x;
        }
    };
    */

    拓展学习

    快速求幂套路模板要熟悉

  • 相关阅读:
    Pytorch-情感分类实战(基于LSTM,调用torchtext)
    Pytorch-LSTM
    Pytorch-时间序列预测
    Pytorch-RNN
    SQLServer -------- 包含(charindex)
    .NET ------ 树形菜单,点击单选按钮触发相应事件
    电子秤Xk3190-A12+E 称重方式的设置方法
    串口调试工具与com口编程
    .NET ------ Repeater 遍历数据显示在页面上
    .NET ------ 将弹窗内增加选项卡
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/13409198.html
Copyright © 2011-2022 走看看