题目如下:

题目大概意思即是写出一段代码求出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不能太高。至于如何解决这一问题,未完待续。

关于高次幂的取余问题(一稿)相关推荐

  1. 快速幂(取余) c++

    题意:求a的b次幂对p取余的结果 快速幂做法: #include<iostream> using namespace std; int main() {long long a,b,p;ci ...

  2. 数学运算符 +(加)、-(减)、(乘)、(除)、%(取余;取模)、(整除)、(幂运算)及分支结构

    数学运算符: +(加).-(减).*(乘)./(除).%(取余;取模).//(整除).**(幂运算) 1. +.-.*./ python的加减乘除和小学数学中的加减乘除的功能一样 print(3 + ...

  3. C++中取余运算的优化

    0.前言 gcc/g++编译优化选项:-O 这个选项控制所有的优化等级.使用优化选项会使编译过程耗费更多的时间,并且占用更多的内存,尤其是在提高优化等级的时候. -O设置一共有五种:-O0.-O1.- ...

  4. java取余位运算_java学习--高效的除模取余运算(n-1)hash

    没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 int a = a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存 ...

  5. python的取整和取余_python取余取整

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 取余的公式:余数=除数-被除数*商python的的余数是按照整除(向下取整)得到 ...

  6. 洛谷——P1226 取余运算||快速幂

    P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^ ...

  7. 【面试相关】python实现快速幂取余算法详解

    假设我们要计算 2102^{10}210 对1000取模的结果,可以很简单的得到24.但是如果要求 210002^{1000}21000 对1000取模的结果,常规方法就行不通了,因为常规的变量无法容 ...

  8. 洛谷 1226 取余运算||快速幂

    洛谷  取余运算||快速幂 1226 其实比起楼下的大佬们,我主要是多了些位运算和讲解. 想法一: 直接输出 pow(b,q)%k 嗯~~勇气可嘉,但是看一眼数据范围(长整型)就会意识到,这个方法也许 ...

  9. java hash取余_为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash(h-1)=hash%h)位运算公式等价于取余运算?...

    1.什么是hash表? 答:简单回答散列表,在hash结构散列(分散)存放的一种数据集结构. 2.如何散列排布,如何均匀排布? 答:取余运算 3.Java中如何实现? 答:hash&(h-1) ...

最新文章

  1. OpenCV学习(12) 图像的腐蚀与膨胀(3)
  2. php tp 重加载页面,thinkPHP线上自动加载异常与修复方法实例分析
  3. sonar 规则之漏洞类型
  4. vmware linux 编译内核,VMWare编译linux内核的注意事项
  5. TensorFlow 教程 --进阶指南--3.2变量:创建、初始化、保存和加载
  6. idea maven 删除dependencies_使用IDEA创建Maven工程 创建javase工程
  7. 人工智能影响学习的5种方式
  8. Linux常用命令——rsync
  9. 小米路由R1D固件升级后导致Misstar tools插件页面显示错误解决方法
  10. 流程图绘制和符号含义
  11. C语言运行时检查失败#2 周围的堆栈已损坏。
  12. css使用clac()垂直居中
  13. 好消息!Android 模拟器可以运行 ARM 应用了
  14. Android开发技术周报 Issue#8
  15. 7种SQL JOINS 的实现
  16. 易优CMS网站建设类企业网站模板 互联网营销网站模板
  17. 笔记本电脑连接外部显示屏
  18. python 图片识别服装_基于树莓派的服装识别系统及方法与流程
  19. TOP 300 Freeware software!
  20. echarts树图修改连线样式颜色,树的形状曲线和折线,树图边的曲度

热门文章

  1. 用html实现炫酷罗马时钟
  2. 在excel中实现汉字转换拼音首字母大写
  3. 等额本息 vs 等额本金
  4. WTL_Freecell v1.1 (WTL空当接龙v1.1) 2018011
  5. 防止网页被盗用 网页加密完全攻略
  6. 绩效考核中如何填写自我评价?(上)
  7. 计算机软件技术主要基础知识,计算机软件技术基础知识点储备.docx
  8. 钓鱼新招:使用Twitter URL来发起诈骗或传播虚假新闻
  9. 查看linux的超级块
  10. 安卓使用html5动画,精妙无比!8款HTML5动画实例