首页 > 编程语言 >C++快速幂

C++快速幂

时间:2024-08-15 19:55:05浏览次数:16  
标签:取模 模幂 运算 C++ 1000000007 long 快速 result

快速幂算法是一种用于快速计算幂运算(即 ab)的算法,其中 a 是底数,b 是指数。它的主要思想是减少乘法运算的次数,通过将指数 b 分解为二进制形式并利用幂的运算法则来加速计算过程。

以下是一个使用C++实现的快速幂算法的例子,它既可以处理正整数幂的情况,也可以稍微修改以处理模幂运算(即 abmodm)的情况:

普通快速幂算法(计算 ab)


#include <iostream>
using namespace std;
// 函数计算 a 的 b 次方
long long fastPower(long long a, long long b) {
long long result = 1; // 初始化结果为1
a = a % 1000000007; // 如果需要模运算,可以在这里加上取模操作
while (b > 0) {
// 如果b是奇数,则乘以当前的a
if (b & 1) {
result = (result * a) % 1000000007; // 如果需要模运算
}
// b右移一位(相当于b除以2),a平方
b >>= 1;
a = (a * a) % 1000000007; // 如果需要模运算
}
return result;
}
int main() {
long long a, b;
cout << "Enter base and exponent: ";
cin >> a >> b;
cout << "Result: " << fastPower(a, b) << endl;
return 0;
}

注意:在上述代码中,我加入了取模操作(% 1000000007),这是为了防止结果溢出,并且在处理大数问题时非常有用。如果不需要取模,可以移除所有 % 1000000007 操作。

模幂运算(计算 abmodm)

上面的代码已经包括了模幂运算的示例,但是如果你想要一个更明确的函数来处理模幂运算,可以这样写:


long long modPower(long long a, long long b, long long m) {
long long result = 1;
a = a % m; // 先对a取模
while (b > 0) {
if (b & 1) {
result = (result * a) % m;
}
b >>= 1;
a = (a * a) % m;
}
return result;
}

这个函数接受三个参数:底数 a,指数 b,和模数 m,并返回 abmodm 的结果。这在密码学、大数运算等领域非常有用。

标签:取模,模幂,运算,C++,1000000007,long,快速,result
From: https://blog.csdn.net/SpXace/article/details/141230591

相关文章

  • 【USACO题库】 Greedy Gift Givers贪婪的礼物送礼者c++
    ​题目描述:对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(andviceversaforthosewhoviewgiftgivingwithcynicism)。在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人。然而,在任何一群朋友中,有些人将送出......
  • 蓝桥杯2016 C/C++程序设计 B组
    抽签//X星球要派出一个5人组成的观察团前往W星。//其中://A国最多可以派出4人。//B国最多可以派出2人。//C国最多可以派出2人。//....//那么最终派往W星的观察团会有多少种国别的不同组合呢?//下面的程序解决了这个问题。//数组a[]中既是每个国家可以派出的最多的名......
  • gateway 快速上手
    服务提供者服务消费者网关启动服务能看到这三个服务测试,访问my-provider-test测试,my-consumer-test通过Feign远程调用my-provider-test......
  • 【C++】动态内存(二)智能指针
    由于new和delete会造成一定程度的内存泄漏问题,以及内存所有权不清晰,因此引入自动销毁相应内存空间的智能指针。智能指针是抽象数据类型,本身具有析构函数,因此调用之后会自动调用析构函数,在析构函数中会自动调用delete来释放相应内存空间,因此不用手动显式的调用delete。【......
  • 在C/C++中嵌入Lua代码及使用VS Code调试
     Lua在设计之初就是为了嵌入到应用程序中,为这些应用程序提供灵活的扩展和定制功能。Lua的核心是用C语言编写的,所以Lua脚本可以很容易地与C/C++代码进行交互,通过Lua脚本,用户可以在不修改原有C/C++代码的基础上,实现功能的扩展和定制。 在C/C++程序中可以使用Lua来编写一些需......
  • 快速符合ISO26262产品认证——动力域L2监控方案精华分享
    一、VCU应用层监控方案的ISO26262背景    “软件定义汽车”趋势下,更多汽车软件问题与消费者生命安全密切相关。而汽车行业ISO26262《道路车辆功能安全》是一个国际安全标准,对安装在量产道路车辆上的电气、电子系统的功能安全进行了约束和规定,避免对人身的伤害。  ......
  • 快速排序
    quicksort是非常常见的排序写法也多种多样核心是每次函数递归/迭代有两个状态,left和right当left<right的时候才会继续分割,否则return(left>=right)pivot的选择一般是随机选择,也会有人选最左边的,或者最中间的,这无所谓因为范围实际上边界可以取,所以是[left,r......
  • C++标准库 algorithm 堆操作 heap
    算法库-堆操作基本操作make_heap()(1)从一个元素范围创建出一个最大堆(2)将区间内的元素转化为heap.--传比较器push_heap()对heap增加一个元素.将一个元素加入到一个最大堆pop_heap()对heap取出下一个元素.从最大堆中移除最大元素sort_heap()对heap转化为一......
  • C++标准库 iomanip 输入输出操纵符 Manipulator
    输入/输出操纵符输入输出操纵符是C++中用于控制输入输出流格式的一组特殊函数或对象。它们通常用于格式化输出,例如设置宽度、精度、对齐方式等,而不涉及数据的实际读写。功能概述:输入输出操纵符能够控制输出的外观,比如调整对齐方式、设置输出的宽度和精度、控制换行等。使用......
  • 【计算机二级C++】题目与C++知识自检
    @目录公共基础知识计算机基础数据库数据结构树链表排序队列栈C++const与static指针函数重载构造与析构多态、继承、权限数据类型输入输出流模板公共基础知识计算机基础计算机完成一条指令所花费的时间称为指令周期顺序程序不具有并发性下列叙述中正确的是CA.算法的......