快速幂(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.mzph.cn/news/209284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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…

企业计算机服务器中了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…

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…

js 复制粘贴板,当clipboardjs 不好使怎么办?

最近项目中做一个很常见的复制粘贴的功能耽误了比较长的时间特此记录&#xff0c;在往常这个功能直接用 clipboard 做就行了&#xff0c;但是这次却发现复制功能不好使了&#xff0c;虽然走了复制成功的回调&#xff0c;但是粘贴板并没有复制的内容。代码如下 <div v-for&q…

人工智能教程(三):更多有用的 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 应用部署实…

微前端 前置知识2--- monorepo架构

目录 前言 pnpm vs npm pnpm设计思想 硬连接 软链接 &#xff08;符号链接&#xff09; 原理 pnpm 指令 monorepo架构 介绍 配置monorepo pnpm --filter 前言 我们采用的是微前端一个主应用&#xff0c;和多个子应用&#xff0c;我们肯定不会一个一个去install安装…

12.5单端口RAM,JS计数器,流水线乘法器,不重叠序列检测器(状态机+移位寄存器),信号发生器,交通灯

单端口RAM timescale 1ns/1nsmodule RAM_1port(input clk,input rst,input enb,input [6:0]addr,input [3:0]w_data,output wire [3:0]r_data );reg [6:0]mem[127:0];integer i;always (posedge clk or negedge rst) beginif(!rst) beginfor (i0; i<127 ; ii1) beginmem[i]…

Linux--权限问题(1)

前文 Linux--初识和基本的指令&#xff08;1&#xff09;-CSDN博客 Linux--初识和基本的指令&#xff08;2&#xff09;-CSDN博客 Linux--初识和基本的指令&#xff08;3&#xff09;-CSDN博客 目录 前文 前言 1.剩余指令部分 1.1 打包和压缩的其它指令 2.权限部分 2.1权…

Qt基础-程序打包发布方法

本文讲解Qt程序打包发布方法。 一、使用Qt自带的windeployqt 生成可运行的包 准备将Qt生成的exe拷入到单独的文件夹,并进行命名,本文命名为packDemorun,并将文件放到D盘(自己随意放置) 1、找到Qt自带的命令终端 2、启动命令终端 3、输入:cd /d D:\packDemorun,进入文…

IDEA删除最近打开的文件记录

IDEA删除最近打开的文件记录 遇见问题&#xff1a;如何删除IDEA中最近打开的文件记录 解决方法 先关闭IDEA 找到 recentProjects.xml 文件 windows 位置&#xff1a;&#xff08;AppData是隐藏文件夹&#xff09; 1.C:\Users\电脑用户名\AppData\Roaming\JetBrains\IntelliJIde…

Git 请输入一个提交信息以解释此合并的必要性

操作方法&#xff1a;按住Ctrl加下面的某个字母

linux-man命令的使用及练习

目录 1. 命令概述 2. 使用 3. 练习 ?man services时报错&#xff1a;No manual entry for services的解决办法 4. man命令中常用按键以及用途 1. 命令概述 Linux提供了丰富的帮助手册&#xff0c;当你需要查看某个命令的参数时不必到处上网查找&#xff0c;只要man一下即…

AI降重软件,AI降重后原创高质量文章

在当今信息爆炸的时代&#xff0c;写作与创作的重要性日益凸显。随着大量内容的涌现&#xff0c;文章降重成为了许多作者和内容创作者的一大问题。本文将专心分享该软件的优势&#xff0c;并为广大用户推荐几款好用的AI降重软件。 AI降重使用场景 AI降重技术利用机器学习算法和…

OpenCV图像相似性比对算法

背景 在做图像处理或者计算机视觉相关的项目的时候&#xff0c;很多时候需要我们对当前获得的图像和上一次的图像做相似性比对&#xff0c;从而找出当前图像针对上一次的图像的差异性和变化点&#xff0c;这需要用到OpenCV中的一些图像相似性和差异性的比对算法&#xff0c;在O…