快速冪(C語言)

前言
快速冪算法一般用于高次冪取模的題目中,比如求3的10000次方對7取模。這時候有些同學會說:這還不簡單?我直接調用pow函數然后對結果%7不得了么?可是3的10000次方這么龐大的數字,真的能儲存在計算機里么?顯然是不行的,只會得到一個錯誤的數字,那么我們怎樣才能得到答案呢?首先我們要知道取模的運算法則。
( a * b ) % c = ( ( a % c ) * ( b % c ) ) % c (要是不知道為什么請自行百度)
在了解了取模的運算法則后就讓我們進入今天的正題吧!
在這里插入圖片描述
快速冪
既然我們知道了取模的運算法則,那么3的一萬次方%7轉化成(((3%7)*3)%7)*3)%7…
這樣便不會出現數字太大超出范圍的情況。這一種我們可以采用循環的方法實現。

#include<stdio.h>
int main()
{int a = 3, b = 10000;int ans = 1;while (b--){ans = ans * a % 7;}printf("%d\n", ans);return 0;
}

可是這樣要進行一萬次的循環,效率非常之低,這時就需要用到我們的快速冪算法。
首先3的一萬次方=9的5千次方=81的2500次方…以此類推。如果我們對底數平方處理,那么我們只需要將冪除以2即可。這樣能極大地提高效率,但是要注意特殊情況,比如3的10001次方此時10001并不是一個偶數,但是我們可以把它變成偶數,可以變為3*3的一萬次方,也就是說我們在進行快速冪算法時要考慮冪的奇偶情況。
下面我用代碼來為大家展示。

#include<stdio.h>
int main()
{int a = 3, b = 10000;int ans = 1;while (b)//當b大于0時進行循環{if (b%2==1)ans = ans*a%7;b /= 2;a = a*a%7;}printf("%d", ans);return 0;
}

那么有沒有更快的方式呢?當然有,我們知道使用位操作符和移位操作符的運算速度比使用/和%要快上好多。那么我們就可以對代碼進行這樣的修改。

#include<stdio.h>
int main()
{int a = 3, b = 10000;int ans = 1;while (b){if (1 & b)//若果1&b=1說明b是奇數,如果1&b=0說明b是偶數ans = ans*a%7;b >>= 1;//相當于b=b/2a = a*a%7;}printf("%d", ans);return 0;
}

這就是快速冪算法,如果覺得博主講得不錯請給博主一個贊支持一下吧~(如果能再收藏一下就更好了),那么今天的分享就到這里,我們下期再見!

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

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

相關文章

HTML行內元素與塊級元素的區別(超詳細)

目錄 行內元素&#x1f338;常見的行內元素&#x1f338;行內元素&#xff08;內聯元素&#xff09;的特性 塊級元素&#x1f338;常見的塊級元素&#x1f338;塊級元素的特性 相互轉換(display)&#x1f338;行內塊狀元素的特性 行內元素 &#x1f338;常見的行內元素 <s…

c#學習相關系列之as和is的相關用法

一、子類和父類的關系 public class Program{static void Main(string[] args){Animal animal new Dog();// Dog dog (Dog)new Animal(); 編譯成功&#xff0c;運行報錯Dog dog (Dog)animal;Dog dog new Dog();Animal animal dog; //等價于Animal animal new Dog();}}pub…

java多生產者多消費者模擬實現

package com.example.springboottestone.main;import java.util.LinkedList; import java.util.Queue;/*** 多生產者多消費者模型是指多個生產者線程同時向緩沖區中添加數據&#xff0c;同時多個消費者線程從緩沖區中獲取數據的并發模型。這種模型適用于需要高并發處理數據的場…

企業計算機服務器中了eking勒索病毒怎么辦,eking勒索病毒解密數據恢復

隨著計算機網絡技術的不斷發展與應用&#xff0c;企業的生產運營效率得到了極大提升&#xff0c;但網絡安全威脅一直存在&#xff0c;網絡威脅的技術也在不斷更新&#xff0c;給企業的數據安全帶來了嚴重威脅。在本月&#xff0c;云天數據恢復中心陸續接到很多企業的求助&#…

C++ Qt開發:Qt的安裝與配置

Qt是一種C編程框架&#xff0c;用于構建圖形用戶界面&#xff08;GUI&#xff09;應用程序和嵌入式系統。Qt由Qt公司&#xff08;前身為Nokia&#xff09;開發&#xff0c;提供了一套跨平臺的工具和類庫&#xff0c;使開發者能夠輕松地創建高效、美觀、可擴展的應用程序。其被廣…

Python---random庫

目錄 基本隨機數函數(): rand.seed() random() 擴展隨機數函數(): random庫包含兩類函數&#xff1a;基本隨機數函數&#xff0c;擴展隨機數函數 基本隨機數函數:seed(),random() 擴展隨機數函數&#xff1a;randint,getrandbits(),uniform(),randrange(),choice(),shuff…

猴子吃桃問題(for循環)

一只猴子第一天摘下若干個桃子&#xff0c;當即吃了一半&#xff0c;還不過癮&#xff0c;又多吃了一個&#xff1b;第二天早上又將剩下的桃子吃掉一半&#xff0c;又多吃了一個。以后每天早上都吃了前一天剩下的一半加一個。到第N天早上想再吃時&#xff0c;見只剩下一個桃子了…

ECS云主機容量大于2TB,初始化Linux數據盤(parted)

本文為您介紹當容量大于2TB時&#xff0c;如何在Linux環境下適用parted分區工具初始化數據盤。 操作場景 本文以“CentOS 7.6 64位”操作系統為例&#xff0c;介紹當磁盤容量大于2TB時&#xff0c;如何使用parted分區工具在Linux操作系統中為數據盤設置分區&#xff0c;操作回…

SAP UI5 walkthrough step6 Modules

在SAPUI5 中&#xff0c;資源通常用作Modules&#xff0c;這個我們將用Message Toast 來實現告警功能 修改controller.js webapp/controller/App.controller.js sap.ui.define(["sap/ui/core/mvc/Controller","sap/m/MessageToast" ], (Controller, Mes…

Python中的Alpha-Beta剪枝算法:優化博弈樹搜索

標題&#xff1a;Python中的Alpha-Beta剪枝算法&#xff1a;優化博弈樹搜索 摘要&#xff1a;Alpha-Beta剪枝算法是一種用于優化博弈樹搜索的算法&#xff0c;能夠降低搜索的時間復雜度&#xff0c;提高程序的性能和效率。本文將介紹Alpha-Beta剪枝算法的原理&#xff0c;以及…

Java 1對1

文章目錄 前言 客戶端 服務器端 輸出線程端 End 前言 TCP&#xff08;Transmission Control Protocol&#xff09;是一種面向連接的、可靠的網絡傳輸協議&#xff0c;它提供了端到端的數據傳輸和可靠性保證。 本程序就是基于tcp協議編寫而成的。 利用 TCP 協議進行通信的…

js 復制粘貼板,當clipboardjs 不好使怎么辦?

最近項目中做一個很常見的復制粘貼的功能耽誤了比較長的時間特此記錄&#xff0c;在往常這個功能直接用 clipboard 做就行了&#xff0c;但是這次卻發現復制功能不好使了&#xff0c;雖然走了復制成功的回調&#xff0c;但是粘貼板并沒有復制的內容。代碼如下 <div v-for&q…

java實現冒泡排序算法

文章目錄 冒泡排序算法 冒泡排序算法 算法原理&#xff1a; 比較相鄰的元素。如果第一個比第二個大&#xff0c;就交換他們兩個。 對每一對相鄰元素做同樣的工作&#xff0c;從開始第一對到結尾的最后一對。在這一點&#xff0c;最后的元素應該會是最大的數。 針對所有的元素重…

Leetcode 345. Reverse Vowels of a String

Problem Given a string s, reverse only all the vowels in the string and return it. The vowels are ‘a’, ‘e’, ‘i’, ‘o’, and ‘u’, and they can appear in both lower and upper cases, more than once. Algorithm Collect all the vowels and reverse the…

人工智能教程(三):更多有用的 Python 庫

目錄 前言 推薦 JupyterLab 入門 復雜的矩陣運算 其它人工智能和機器學習的 Python 庫 前言 在本系列的上一篇人工智能教程&#xff08;二&#xff09;&#xff1a;人工智能的歷史以及再探矩陣中&#xff0c;我們回顧了人工智能的歷史&#xff0c;然后詳細地討論了矩陣。在…

【數據結構和算法】--- 棧

目錄 棧的概念及結構棧的實現初始化棧入棧出棧其他一些棧函數 小結棧相關的題目 棧的概念及結構 棧是一種特殊的線性表。相比于鏈表和順序表&#xff0c;棧只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂&#xff0c;另一端稱為棧底。棧中的…

概率論之 證明 正態分布的上a 分位點的對稱的性質

公式(Z(a) -Z(1-a)) 表示正態分布的上(a)分位點與下(1-a)分位點在分布曲線上關于均值的對稱性。 左側 (Z(a))&#xff1a; 這是分布曲線上累積概率為(a)的那個點。也就是說&#xff0c;這是一個使得這個點及其左側的面積占據整個曲線下方(a)的位置。 右側 (Z(1-a))&#xff1…

Kubernetes(K8s 1.27.x) 快速上手+實踐,無廢話純享版

文章目錄 1 基礎知識1.1 K8s 有用么&#xff1f;1.2 K8s 是什么&#xff1f;1.3 k8s 部署方式1.4 k8s 環境解析 2 環境部署2.1 基礎環境配置2.2 容器環境操作2.3 cri環境操作2.4 harbor倉庫操作2.5 k8s集群初始化2.6 k8s環境收尾操作 3 應用部署3.1 應用管理解讀3.2 應用部署實…

[Firefly-RK3399] TFTP/NFS網絡啟動內核與Buildroot文件系統

?網絡啟動&#xff0c;是用 TFTP 在服務器下載內核、dtb 文件到目標機的內存中&#xff0c;同時可以用 NFS 掛載網絡根文件系統到目標機上&#xff0c;實現目標機的無盤啟動。 準備工作&#xff1a; Firefly-RK3399 板卡&#xff1b;路由器、網線&#xff1b;安裝有 NFS 和 …

微前端 前置知識2--- monorepo架構

目錄 前言 pnpm vs npm pnpm設計思想 硬連接 軟鏈接 &#xff08;符號鏈接&#xff09; 原理 pnpm 指令 monorepo架構 介紹 配置monorepo pnpm --filter 前言 我們采用的是微前端一個主應用&#xff0c;和多個子應用&#xff0c;我們肯定不會一個一個去install安裝…