首页 > 编程语言 >快速幂算法

快速幂算法

时间:2023-08-11 21:22:04浏览次数:32  
标签:取模 ch int 二进制 算法 次方 快速

快速幂算法

快速幂算法是一种高效的计算幂的方法,它的核心思想是将指数分解为二进制形式,然后通过迭代计算得到结果。本文将详细介绍快速幂算法的原理、流程以及C++代码实现,并给出一个例题及题解。

原理

快速幂算法的基本思想是将指数表示为二进制形式,然后通过迭代计算得到结果。具体步骤如下:

  1. 将指数转换为二进制形式。
  2. 从最低位开始,如果当前位为1,则将结果乘以底数的当前幂次方;如果当前位为0,则不进行任何操作。
  3. 将底数的当前幂次方左移一位,继续处理下一位。
  4. 当所有位都处理完毕后,返回结果。

流程

下面我们来看一下快速幂算法的具体流程:

  1. 首先,将指数转换为二进制形式。例如,对于指数a^b,可以将其表示为a^(b * 2^n),其中n是二进制表示中最高位的位置。
  2. 从最低位开始,遍历二进制形式的每一位。对于每一位,如果当前位为1,则将结果乘以底数的当前幂次方;如果当前位为0,则不进行任何操作。这一步的目的是利用幂的性质a^(b * 2^n) = (a^b)^2^n简化计算过程。
  3. 将底数的当前幂次方左移一位,继续处理下一位。这一步的目的是将指数中的每一位都考虑进去。
  4. 当所有位都处理完毕后,返回结果。

C++代码实现

下面我们来看一下快速幂算法的C++代码实现:

//a^b
//求a的b次方对p取模的值,小于10^9
#include<bits/stdc++.h>
#define reg register
using namespace std;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')	f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
inline void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9)	write(x/10);
	putchar(x%10+'0');
	return ;
}
// 定义一个函数,用于计算 a 的 b 次方对 p 取模的值,结果小于 10^9
int power(int a, int b, int p){
	int ans=1%p; // 初始化答案为 1 对 p 取模的结果
	for(;b;b>>=1){ // 当 b 不为 0 时,执行循环
		if(b&1) ans=(long long ) ans*a%p; // 如果 b 是奇数,将 ans 乘以 a 并对 p 取模
		a=(long long ) a*a%p; // 将 a 平方并对 p 取模
	}
	return ans; // 返回答案
}

int main(){
	int a=read(),b=read(),p=read();
	printf("%d^%d mod %d=%d",a,b,p,power(a,b,p));// 调用 power 函数,并将结果写入输出
	return 0; // 程序正常结束
}

例题及题解

题目:计算a^b,其中ab都是整数,且1 <= a <= 100,1 <= b <= 100。请编写一个程序,使用快速幂算法计算a^b的结果,并输出结果。

解答:首先,我们需要将指数转换为二进制形式。然后,根据快速幂算法的原理,从最低位开始遍历二进制形式的每一位,计算结果。最后,输出结果即可。

标签:取模,ch,int,二进制,算法,次方,快速
From: https://www.cnblogs.com/Nebulary/p/17623964.html

相关文章

  • Oracle-快速恢复区
    快速恢复区是一个磁盘目标,用作与恢复相关的文件的默认位置。可以使用两个实例参数对快速恢复区进行控制:db_recovery_file_destdb_recovery_file_dest_size第一个参数指定位置。这可以是文件系统目录或ASM磁盘组。多个数据库可以共享一个公共目标;在目标中,每个数据库都有各自自动创......
  • 代码随想录算法训练营第十五天| 层序遍历 10 ,226.翻转二叉树 101.对称二叉树 2
     层序遍历   卡哥建议:看完本篇可以一口气刷十道题,试一试, 层序遍历并不难,大家可以很快刷了十道题。  题目链接/文章讲解/视频讲解:https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html  做题思......
  • C++欧几里得算法求最大公约数和最小公倍数
    定义最大公约数即为GreatestCommonDivisor,常缩写为gcd。一组整数的公约数,是指同时是这组数中每一个数的约数的数。一组整数的最大公约数,是指所有公约数里面最大的一个。那么如何求最大公约数呢?我们先考虑两个数的情况。欧几里得算法过程如果我们已知两个数\(a\)和\(......
  • RISC-V在快速发展的处理器生态系统中找到立足点
    原文:RISC-VFindsItsFootholdinaRapidlyEvolvingProcessorEcosystem作者:AgamShah转载自:https://thenewstack.io/risc-v-finds-its-foothold-in-a-rapidly-evolving-processor-ecosystem/以下是正文Buttheopensourceprocessorarchitecturewillneedtofindmor......
  • 王道408---冒泡排序、快速排序、直接插入排序、希尔排序、二路归并排序、简单选择排序
    一、冒泡排序冒泡排序属于交换类的排序//时间复杂度:O(n^2)//空间复杂度:O(1)//稳定排序算法#include<stdio.h>#include<iostream>usingnamespacestd;intarr[16];voiddebug(){for(inti=1;i<16;i++){printf("%d",arr[i]);}puts("......
  • 谷歌2023年4月19日最新更新规则及算法
    多年来,谷歌的的核心排名系统一直致力于奖励能够提供良好网页体验的内容,正如谷歌在 2011年提供的2019年更新,并于去年加入创建实用、可靠、以用户为中心的内容帮助页面的指南中所述。该帮助页面是谷歌的搜索要素的关键资源。会定期推荐希望使用Google搜索取得理想成效的用户,仔......
  • 算法练习-day46
    单调栈739.每日温度题意:给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。实例:思路:本题作为单调栈的第一道题,我们需要了解什么是单调栈?单调栈中存储......
  • 从Bellman方程到派单与调度算法(二)-- 派单算法
    在派单决策中的MDPMDP构建在派单决策中,构建MDP来表示不同时空下的价值,并应用到线上派单中。以司机为智能体,有:S:时间和空间预先划分为时间片和六边形区域,每一个(时间片-六边形)表示一个状态A:两种动作:接单和空闲。P:接单会100%概率转移到状态(完单时间片,终点六边形),不接单会100%......
  • 从Bellman方程到派单与调度算法
    Bellman方程在派单和调度中的应用 从MP到MRP再到MDPMPM={S,P}马尔科夫过程。后续的状态只与当前状态有关,与当前状态之前的状态无关。 MRPM={S,P,R,γ}马尔科夫奖励过程。在马尔科夫过程的基础上增加了奖励R和衰减系数γ<0。定义Gt为在此时刻到过程结束后所得......
  • 文心一言 VS 讯飞星火 VS chatgpt (74)-- 算法导论7.2 2题
    二、如果用go语言,当数组A的所有元素都具有相同值时,QUICKSORT的时间复杂度是什么?文心一言:在Go语言中,对一个所有元素都相等的数组进行快速排序(QuickSort)的时间复杂度是O(nlogn)。快速排序是一种分而治之的排序算法,它将一个数组分成两个子数组,然后对这两个子数组进行递归排序。......