当前位置: 首页 > article >正文

Leetcode 50.Pow(x,n) 使用快速幂求解

快速幂介绍

基础前提
1.任何数都可以用二进制表示
2. x n 1 + n 2 + n 3 = = x n 1 ∗ x n 2 ∗ x n 3 x^{n_1+n_2+n_3}==x^{n_1} * x^{n_2} * x^{n_3} xn1+n2+n3==xn1xn2xn3
由此基本前提可推论得
接下来举Pow(2,11)的例子说明
1 1 10 = = 101 1 2 11_{10} == 1011_2 1110==10112
因此,原式可以写成
P o w ( 2 , 11 ) = = 2 8 ∗ 2 2 ∗ 2 1 Pow(2,11) == 2^{8} * 2^{2} * 2^{1} Pow(2,11)==282221
因此,只需要把原式中的指数n先化为2进制,再转化为乘法的形式即可
而每次乘的因子来自于 2 2 2的每次平方

2 8 = = 2 4 ∗ 2 = = 2 2 ∗ 2 ∗ 2 2^8 == 2^{4*2} == 2^{2*2*2} 28==242==2222
所以只需要存储一个临时temp变量,用来计算每次平方的值;如果这一位二进制是1,就乘上;否则就不管。

下面附上代码

class Solution {
public:
    double myPow(double x, int n) {
        string a = "";
        long double k; 
        int flag = 0;
        if(n < 0)
        {
            k = 1/x;
        }
        else k = x;
        x=1;

        while(n)
        {
            a += (char)(n%2+'0');
            n/=2;
        }
        while(a != "")
        {
            int temp = a[0]-'0';
            if(temp)x *= k;
            a = a.substr(1);
            k *= k;
        }
        return x;
    }
};

http://www.kler.cn/a/593334.html

相关文章:

  • Flask从入门到精通--初始Flask
  • 仓库管理不能仅流于形式,需挖掘潜在价值
  • [科普] git和github等是什么关系 (由DS-R1生成)
  • Android SDK下载安装配置
  • 机器学习快速入门教程
  • 栈/堆/static/虚表
  • Fisher 信息矩阵公式原理:使用似然估计,二阶导数等知识点
  • MySQL 在 CentOS 7 上安装的步骤指南
  • Web3身份验证技术对数据保护的影响研究
  • C#入门学习记录(二)C# 中的转义字符——字符串处理的“魔法钥匙”​
  • QT入门笔记3
  • 这样配置让Nginx更安全
  • 服装零售行业数字化时代的业务与IT转型规划P111(111页PPT)(文末有下载方式)
  • iwebsec-SQL数字型注入
  • 基于Babylon.js的Shader入门之五:让Shader支持法线贴图
  • jmeter验证正则表达式提取值是否正确
  • C语言中,memmove和memcpy的区别?
  • 脚本一键式启动Nginx、Mysql、Redis
  • 台式机电脑组装---电脑机箱与主板接线
  • 利用 Resnet50 重新训练,完成宠物数据集的识别,附源代码。。