关于高次幂的取余问题(一稿)
题目如下:
题目大概意思即是写出一段代码求出a^b%c的结果,看起来很简单,所以直接按照题干意思,写出代码如下:
(这里有个注意事项,要把pow输出的double变为int类型赋值给d)
按照题目参考数据输出结果如下:
结果是正确的。
乍一看,好像已经完全满足题目的要求,我们要做的事情只是让计算机算出a^b的值再对c取余即可得出结果。但好奇的我对此产生了思考:万一a,b,c的值都很大呢?也正确吗?
结果得出了这样的结果。很明显是不正确的。
仔细想想,a的b次方是一个正数,再对c取余肯定也是一个正数,为什么最后会输出一个负数结果呢?
考虑到int的取值范围是-2^31~(2^31-1),推断出应该是a^b的数值溢出了,导致结果出错。
所以这种暴力求解的方法不可取,必须要找到另一种方法来找出结果。
既然是由于整个式子数值太大了导致结果出错。因此考虑运用模的知识来对(a^b)%c进行化简。
首先举出有关模的运算规则:
(a + b) % p = (a % p + b % p) % p (1)
(a – b) % p = (a % p – b % p) % p (2)
(a * b) % p = (a % p * b % p) % p (3)
(a^b) % p = ((a % p)^b) % p (4)
结合律:
((a+b) % p + c) % p = (a + (b+c) % p) % p (5)
((a*b) % p * c)% p = (a * (b*c) % p) % p (6)
交换律:
(a + b) % p = (b+a) % p (7)
(a * b) % p = (b * a) % p (8)
分配律:
((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p (9)
重要定理:
若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p);(10)
若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p);(11)
若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a – c) ≡ (b – d) (%p),
(a * c) ≡ (b * d) (%p),(a / c) ≡ (b / d) (%p); (12)
(此运算规则转载自CSDN博主「GKHack」的原创文章,原文链接:https://blog.csdn.net/GKHack/article/details/46607293)
运用模的运算规则,我们可以将(a^b)%c转变为(a%c*(a^(b-1))%c)%c,
a^(b-1))%c又可以进一步拆成a和a的b-2次方,进而运用递归的方法实现。这就保证了每次()%c的时候,括号里面的两个相乘的数一定小于c,从而数值不会溢出。
附上代码:
结果1:
结果2(比较大):
反思:
1、计算机由于数值范围,往往不能够将一个表达式直接暴力求解,应该运用数学知识将其转化,同时也可以减少计算机的运算次数,加快运算。
2、另外,由于栈的内存分配问题,此代码有个缺陷就是递归次数不能太多,导致这里的次数b不能太高。至于如何解决这一问题,未完待续。
关于高次幂的取余问题(一稿)相关推荐
- 快速幂(取余) c++
题意:求a的b次幂对p取余的结果 快速幂做法: #include<iostream> using namespace std; int main() {long long a,b,p;ci ...
- 数学运算符 +(加)、-(减)、(乘)、(除)、%(取余;取模)、(整除)、(幂运算)及分支结构
数学运算符: +(加).-(减).*(乘)./(除).%(取余;取模).//(整除).**(幂运算) 1. +.-.*./ python的加减乘除和小学数学中的加减乘除的功能一样 print(3 + ...
- C++中取余运算的优化
0.前言 gcc/g++编译优化选项:-O 这个选项控制所有的优化等级.使用优化选项会使编译过程耗费更多的时间,并且占用更多的内存,尤其是在提高优化等级的时候. -O设置一共有五种:-O0.-O1.- ...
- java取余位运算_java学习--高效的除模取余运算(n-1)hash
没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 int a = a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存 ...
- python的取整和取余_python取余取整
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 取余的公式:余数=除数-被除数*商python的的余数是按照整除(向下取整)得到 ...
- 洛谷——P1226 取余运算||快速幂
P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^ ...
- 【面试相关】python实现快速幂取余算法详解
假设我们要计算 2102^{10}210 对1000取模的结果,可以很简单的得到24.但是如果要求 210002^{1000}21000 对1000取模的结果,常规方法就行不通了,因为常规的变量无法容 ...
- 洛谷 1226 取余运算||快速幂
洛谷 取余运算||快速幂 1226 其实比起楼下的大佬们,我主要是多了些位运算和讲解. 想法一: 直接输出 pow(b,q)%k 嗯~~勇气可嘉,但是看一眼数据范围(长整型)就会意识到,这个方法也许 ...
- java hash取余_为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash(h-1)=hash%h)位运算公式等价于取余运算?...
1.什么是hash表? 答:简单回答散列表,在hash结构散列(分散)存放的一种数据集结构. 2.如何散列排布,如何均匀排布? 答:取余运算 3.Java中如何实现? 答:hash&(h-1) ...
最新文章
- OpenCV学习(12) 图像的腐蚀与膨胀(3)
- php tp 重加载页面,thinkPHP线上自动加载异常与修复方法实例分析
- sonar 规则之漏洞类型
- vmware linux 编译内核,VMWare编译linux内核的注意事项
- TensorFlow 教程 --进阶指南--3.2变量:创建、初始化、保存和加载
- idea maven 删除dependencies_使用IDEA创建Maven工程 创建javase工程
- 人工智能影响学习的5种方式
- Linux常用命令——rsync
- 小米路由R1D固件升级后导致Misstar tools插件页面显示错误解决方法
- 流程图绘制和符号含义
- C语言运行时检查失败#2 周围的堆栈已损坏。
- css使用clac()垂直居中
- 好消息!Android 模拟器可以运行 ARM 应用了
- Android开发技术周报 Issue#8
- 7种SQL JOINS 的实现
- 易优CMS网站建设类企业网站模板 互联网营销网站模板
- 笔记本电脑连接外部显示屏
- python 图片识别服装_基于树莓派的服装识别系统及方法与流程
- TOP 300 Freeware software!
- echarts树图修改连线样式颜色,树的形状曲线和折线,树图边的曲度