50. Pow(x, n)快速冪算法

實現?pow(x,?n)?,即計算?x?的整數?n?次冪函數(即,xn?)。此函數應將?x?作為浮點數(意味著它可以是十進制數)和?n?作為整數(可以是正數、負數或零)一起使用。

快速冪(Exponentiation by Squaring) 的時間復雜度是 O(log?n),而不是 O(n)。因此比普通連續相乘的暴力解法快很多,尤其在指數很大時更為明顯。

快速冪利用了指數的 二進制分解。關鍵在于每次指數都除以 2(右移)。

代碼:

class Solution {public double myPow(double x, int n) {// If power n is non-negative, calculate power using helper method// 如果指數 n 是非負數,直接調用輔助方法計算if (n >= 0) {return quickPow(x, n);} else {// If power n is negative, calculate the inverse of the power// 如果指數 n 是負數,先轉成 long 類型防止溢出,然后計算倒數return 1 / quickPow(x, -(long) n);}}private double quickPow(double base, long exponent) {double result = 1; // Initialize result to neutral element for multiplication// 初始化結果為 1(乘法的單位元)// Loop through all bits of the exponent// 遍歷指數的每一位(二進制)while (exponent > 0) {// If the current bit is set, multiply the result by the base// 如果當前位是 1(即指數是奇數),說明該位有效,就把當前 base 乘進結果中if ((exponent & 1) == 1) {result *= base;}// Square the base for the next bit in the exponent// 每處理一位,把 base 平方,指數除以 2,平方乘法base *= base;// Shift exponent to the right to process the next bit// 指數右移一位,繼續處理下一個最低位exponent >>= 1;}// Return the final result of base raised to the exponent// 返回最終結果return result;}
}

平方乘法的數學原理

我們知道:

  • x2 = x * x

  • x? = (x2)2

  • x? = (x?)2

也就是說:

x^2k = (x^k)^2

這說明:

如果我們每次把底數平方,就相當于一次性“處理了兩個冪”。

? 示例過程:a = 2, n = 13

nn 的二進制當前位result 操作base 操作新 result新 base
1311011result *= basebase = base224
601100-base = base2216
300111result *= basebase = base232256
100011result *= basebase = base2819265536
00000-結束

如果指數 n 是負數,先轉成 long 類型防止溢出?

Java 中 int 類型的取值范圍是:
👉 [-231, 231?-?1]
👉 即 [-2147483648, 2147483647]

int n = Integer.MIN_VALUE; ? // n = -2147483648
int positive = -n; ? ? ? ? ? // 正常來說你想讓它變成 2147483648

System.out.println(positive); // 實際輸出:-2147483648(依然是負數!)
為什么?因為 2147483648 超出了 int 最大值!

? 解決方法:先轉成 long
return 1 / quickPow(x, -(long) n);
這樣 -(long) n 的計算就不會發生溢出了:

long 是 64 位的,能表示的范圍非常大:

-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

int 的表示范圍大得多,所以:

long n = Integer.MIN_VALUE; // n = -2147483648 long positive = -n; // 不會溢出 System.out.println(positive); // 輸出:2147483648 ?

🔍 為什么這在快速冪中很重要?
因為我們要把 n 轉為正數,才能做快速冪:

如果你不轉為 long,那么:
quickPow(x, -n); // 這里 -n 就可能等于 Integer.MIN_VALUE
就會導致邏輯錯誤甚至死循環(因為指數沒變正)。

📘 看一下幾個重要值及其補碼:

十進制值二進制補碼表示注釋說明
-214748364810000000 00000000 00000000 00000000最小的 int,符號位為 1,其他全 0
-214748364710000000 00000000 00000000 00000001第二小,最低位是 1
-111111111 11111111 11111111 11111111補碼中所有位都是 1
000000000 00000000 00000000 00000000全 0
100000000 00000000 00000000 00000001正數,從 1 開始遞增
214748364701111111 11111111 11111111 11111111int 能表示的最大值

補碼的優點:正負數加法可以統一處理(硬件電路簡單)

為什么溢出會“繞回原值”?

Java 中的 int 是固定長度的 32 位,有符號整數。
當你進行超出范圍的計算時,多出來的部分會被截斷,留下的低 32 位成為新的值。
這就像一個指針在一個圓圈里走路,走過最大值后,就繞到了最小值。

為什么右移?

因為在快速冪算法中,我們是從低位(最右邊)開始處理二進制位的,所以需要不斷右移指數,把最低位移出去,這樣我們就能一位一位檢查該不該乘上當前的 base

  • 右移一位(>> 1):相當于除以 2 向下取整

  • 左移一位(<< 1):相當于乘以 2

我們在快速冪中需要不斷除以 2,是為了把 exponent 處理完(直到它變成 0)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88403.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88403.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88403.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

打造絲滑的Android應用:LiveData完全教程

為什么你需要LiveData&#xff1f; 在Android開發中&#xff0c;數據的動態更新一直是個讓人頭疼的問題。想象一下&#xff1a;你的界面需要實時顯示用戶的余額變化&#xff0c;或者一個聊天應用的未讀消息數得隨時刷新。過去&#xff0c;我們可能會用Handler、手動監聽器&…

vue3 el-table 根據字段值 改變整行字體顏色

在 Vue 3 中使用 Element Plus 的 el-table 組件時&#xff0c;如果你想根據某一列的字段值來改變整行的字體顏色&#xff0c;你可以通過使用自定義的 row-class-name 屬性或者通過插槽&#xff08;slot&#xff09;的方式來達到目的。以下是兩種常見的方法&#xff1a; 方法一…

Linux的全新網絡管理命令行工具——nmcli

一、nmcli簡介 1.1、NetworkManager簡介 1.1.1、NetworkManager介紹 在紅帽系的Linux中&#xff0c;默認的網絡服務是由NetworkManager提供的&#xff08;其主要是一個可以進行動態網絡配置和控制的守護進程&#xff09;。 使用NetworkManager的優點 序號使用NetworkManager的優…

C++基礎之智能指針

一、概念 堆內存對象需要手動使用delete銷毀&#xff0c;如果沒有使用delete銷毀就會造成內存泄漏。 所以C在ISO98標準中引入了智能指針的概念&#xff0c;并在ISO11中趨于完善。 使用智能指針可以讓堆內存對象具有棧內存對象的特點&#xff0c;原理是給需要手動回收的內內存對…

python3虛擬機線程切換過程

python實現了自己的多線程&#xff0c;為了保證線程安全&#xff0c;引入了全局解釋器鎖GIL&#xff0c;只有拿到GIL的線程才能執行&#xff0c;所以在python中同一時刻只能有一個線程在運行&#xff0c;python多線程無法發揮多核處理器的威力&#xff0c;《python源碼剖析》中…

PYTHON從入門到實踐5-列表操作

# 【1】列表是可變的&#xff0c;可以修改、追加、刪除 import randomclass Friend(object):def __init__(self, name, age):self.name nameself.age ageif __name__ __main__:friendList []for i in range(0, 9):randomNumber random.randint(0, 100)friend Friend(f&qu…

【linux】network服務啟動網卡流程

目錄 1、介紹2、ifup流程【1】與NetworkManager兼容【2】ifup-eth設置ip【3】ifup-routes設置路由 1、介紹 network服務的核心由/etc/sysconfig/network-scripts/下一堆腳本配置來生效&#xff0c;其中啟動網卡就是通過ifup腳本來實現的&#xff0c;下面就講一下ifup如何恢復i…

如何防止自己的電腦被控制?開啟二次驗證保護教程

遠程操作什么最重要&#xff1f;安全&#xff0c;安全&#xff0c;和安全&#xff01;答案永遠是安全&#xff01;那么究竟如何能讓遠程連接安全性更上一層臺階吶&#xff1f;又是哪家遠控安全策略方面最給力吶&#xff1f;這可不是王婆賣瓜&#xff0c;自賣自夸&#xff0c;確…

微信小程序節點相關總結

微信小程序節點事件總結 bindtap、catchtap、bindclick的區別&#xff1f;bindclick 和 bindtap 的區別在于&#xff1a; e.target和e.currentTargete.typee.timeStamp觸摸事件屬性&#xff08;針對觸摸類事件&#xff09;坐標信息事件綁定數據冒泡與捕獲相關其他特殊屬性**常見…

XSD是什么,與XML關系

XSD&#xff08;XML Schema Definition&#xff09;是用于描述XML文檔結構和內容的一種規范。它定義了XML文檔中元素、屬性、數據類型、數據格式以及它們之間的關系和約束。XSD是W3C&#xff08;萬維網聯盟&#xff09;推薦的標準之一&#xff0c;它比早期的DTD&#xff08;Doc…

Ubuntu服務器中MySQL如何進行主從復制

一、MySQL 主從復制基本原理 MySQL 主從復制是指&#xff1a;一臺數據庫服務器負責寫入操作&#xff0c;并將數據變更以二進制日志形式記錄下來;一臺或多臺從庫通過讀取主庫的二進制日志&#xff0c;實時或半實時地將主庫的寫入操作同步到自身數據庫&#xff0c;實現數據一致性…

Android圖形系統框架解析

前言 Android圖形系統對于開發者來說可能會比較難以理解&#xff0c;因為涉及的東西可能會計較多&#xff0c;比如Android自己的圖形系統。OpenGL&#xff0c;視頻編解碼器&#xff0c;SurfaceFlinger&#xff0c;FrameBuffer等等。下面我們結合官方文檔&#xff0c;介紹一下圖…

AI智能巡檢系統給烘焙店開的「減損藥方」 InfiSight智睿視界

01 食材浪費&#xff1a;甜蜜產業的苦澀成本 后廚操作臺上&#xff0c;剛過最佳賞味期的可頌成批倒入垃圾桶——這是烘焙店最隱秘的痛。現烤現售模式雖保障新鮮度&#xff0c;卻讓原料管理淪為盲區&#xff1a; 銷售數據≠生產指南&#xff1a;總部無法感知門店實時庫存 …

工具 | vscode 發出聲音,如何關閉

設置->搜 accessibility -> Accessibility Support -> 自動 改為 off 設置->搜 volume -> 0 設置->搜 sound -> 輔助功能信號 -> sound的 自動 改為 off 參考&#xff1a; How to turn off (or on) sounds from Visual Studio Code? - Stack Ove…

Hyperf 數據庫事務指南(PHP 框架)

Hyperf 數據庫事務指南&#xff08;PHP 框架&#xff09; 1. ?? 數據庫配置 1.1 配置文件 MySQL 配置位于 config/database.php&#xff0c;通常通過環境變量&#xff08;.env&#xff09;管理敏感信息&#xff1a; <?phpdeclare(strict_types 1); /*** This file i…

動態ds-vnp之normal和shortcut兩種方式配置案例

normal方式配置 hub配置 dhcp enable interface GigabitEthernet0/0/0 ip address 3.3.3.3 255.255.255.0 interface GigabitEthernet0/0/1 ip address 192.168.3.254 255.255.255.0 dhcp select interface interface Tunnel0/0/0 ip address 10.1.1.3 255.255.255.0 tunnel…

ubuntu20.04調試livox aiva驅動獲取激光雷達數據

實驗環境ubuntu20.04 平臺包括本地x86平臺和jetson orin平臺都測試ok 參考 ubuntu20.04上獲取Livox Avia雷達點云數據 1.下載相關資料 下載包括&#xff1a;Livox Avia 用戶手冊中文.pdf、Livox_Viewer_For_Linux_Ubuntu16.04_x64_0.10.0&#xff08;用于顯示激光雷達數據&am…

VS2022 C#【自動化文件上傳】AutoFileUpload 新需求 V13

這里寫自定義目錄標題 需求分析實現方法原來&#xff08;需要修改的位置&#xff09;替換為如下代碼&#xff08;添加三行數據&#xff09; 需求 現在已有程序&#xff1a;AutoFileUpload 存儲excel表中時間列的第一列的列名到數據庫中 分析 user只是想存儲列名到數據表列去…

技術QA | ADC/DAC芯片測試研討會筆記請查收!

6月19日&#xff0c;《ADC/DAC芯片測試前沿&#xff1a;德思特ATX系統高效方案與實戰攻略》線上研討會圓滿結束。感謝大家的觀看與支持&#xff01; 在直播間收到一些觀眾的技術問題&#xff0c;我們匯總了熱點問題并請講師詳細解答&#xff0c;在此整理分享給大家&#xff0c…

區塊鏈技術未來的發展趨勢

以下是區塊鏈技術未來的一些發展趨勢&#xff1a; 技術層面 - 性能提升&#xff1a;分片技術會不斷成熟和完善&#xff0c;將區塊鏈網絡劃分為多個分片&#xff0c;每個分片獨立處理交易&#xff0c;以提高交易吞吐量和網絡可擴展性。同時&#xff0c;共識機制也會持續創新&a…