题目:求(a^n)%p的值。
方案一:暴力解法,先算出a^n的值,然后再去求模。
分析:这种做法最简便直观,但缺点是运算性能不好,在输入较大时会产生溢出,导致结果错误。
代码:

    public static long calMod1(int a, int n, int p) {// 暴力解法1long sum = 1;for (int i = 0; i < n; i++)sum *= a;return sum % p;}

方案二:暴力解法,循环求a^n的每一步中,将求模运算融入其中。
分析:可读性上也是比较直观,并且不会溢出。
代码:

    public static long calMod2(int a, int n, int p) {// 暴力解法2long sum = 1;for (int i = 0; i < n; i++)sum = sum * a % p;return sum % p;}

方案三:在a^n的运算中,随着n的增大,模p的结果最多有p种结果,并且是循环出现的。所以,我们记录其中不断出现的结果,直到有重复的出现(证明一个轮回了)。
分析:性能最优,并且不会溢出。
代码:

public static long calMod3(int a, int n, int p) {// 循环方法if (a % p == 0)return 0;int count = 0;long yushu = a % p;long[] array = new long[p];array[0] = yushu;while (count < n) {yushu = yushu * a % p;if (yushu == array[0])break;elsearray[++count] = yushu;}return array[n % p - 1];}

方案四:运用数学原理:(a*b)%p == (a%p)*(b*p)%p,将a^n不断的拆分成两个部分。
分析:时间复杂度上为O(logN),但因为运用了递归,所以总体性能不如方案三。
代码:

    public static long calMod4(int a, int n, int p) {// 采用二分if (p == 1)return 0;if (n == 0)return 1;if (n % 2 == 0)return calMod4(a, n / 2, p) * calMod4(a, n / 2, p);elsereturn calMod4(a, n / 2, p) * calMod4(a, n / 2, p) * (a % p) % p;}

转载于:https://www.cnblogs.com/xiaoChongUp/p/3337562.html

常见算法之12---求a^n%p相关推荐

  1. c语言分治法求众数重数_五大常见算法策略之——递归与分治策略

    递归与分治策略 递归与分治策略是五大常见算法策略之一,分治策略的思想就是 分而治之 ,即先将一个规模较大的大问题分解成若干个规模较小的小问题,再对这些小问题进行解决,得到的解,在将其组合起来得到最终的 ...

  2. 常见算法题(1)求最大公因数

    最大公因(约)数,是指两个或多个整数共有因数中最大的一个.两个数a,b的最大公因数记作(a,b). 求最大公因数的算法有: (1)辗转相除法 有两整数a和b:     ① a%b得余数c     ② ...

  3. 分治法一个整数数列求最大值最小值_五大常见算法策略之丨递归与分治策略

    递归与分治策略 递归与分治策略是五大常见算法策略之一,分治策略的思想就是分而治之,即先将一个规模较大的大问题分解成若干个规模较小的小问题,再对这些小问题进行解决,得到的解,在将其组合起来得到最终的解. ...

  4. JavaScript 面试中常见算法问题详解

    JavaScript 面试中常见算法问题详解,翻译自 https://github.com/kennymkchan/interview-questions-in-javascript.下文提到的很多问 ...

  5. acm常见算法及例题

    1 acm常见算法及例题 2 3 初期: 4 一.基本算法: 5 (1)枚举. (poj1753,poj2965) 6 (2)贪心(poj1328,poj2109,poj2586) 7 (3)递归和分 ...

  6. Java尚硅谷基础笔记-day4数组-数组常见算法

    第三章 数组 3.4 数组中涉及的常见算法 3.1 数组的概述 3.2 一维数组的使用 3.3 多维数组的使用 3.4 数组中涉及的常见算法 3.5 数组工具类的使用 3.6 数组使用中的常见异常 3 ...

  7. 常见算法之Flood Fill算法

    常见算法之Flood Fill算法 算法介绍 基本作用:寻找连通块 基本方法:BFS搜索 适用题目:需要找出分类块的题目/一些聚类问题 顾名思义,Flood Fill算法就是像洪水泛滥一样去寻找周围符 ...

  8. c语言最长递增子序列nlogn,十月常见算法考题、最长递增子序列,Leetcode第300题最长上升子...

    十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子 十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子序列的变种,我没见过乔丹,今天詹姆斯就是我的神! @Aut ...

  9. 第10章 基础API与常见算法

    第10章 基础API与常见算法 学习目标 了解数学相关API 了解日期时间API 了解系统类API 掌握数组基础算法 掌握数组工具类的使用 熟练掌握String类的API 熟练掌握StringBuil ...

  10. JavaSE-第10章【基础API与常见算法】

    第10章 基础API与常见算法 学习目标 了解数学相关API 了解日期时间API 了解系统类API 掌握数组基础算法 掌握数组工具类的使用 熟练掌握String类的API 熟练掌握StringBuil ...

最新文章

  1. 上传图片并生成缩略图
  2. CDQZ集训DAY8 日记
  3. Swoole命令行输出但浏览器会超时
  4. nginx服务器,访问时显示目录,不直接显示index.php
  5. oracle中触发器只能用于表吗,Oracle触发器的分类和使用
  6. WSO2注册表安装简介
  7. 插件开发-UI插件开发
  8. 中台不火,天理难容!
  9. ExpandableListActivity列表嵌套列表
  10. 两个电脑如何切换以方便使用文件
  11. iphone主屏幕动态壁纸_苹果11怎么设置动态壁纸?这个简单!只需这样操作
  12. 30分钟学习掌握springmvc、SSM
  13. Hibernate的下载与配置
  14. 如何购买阿里云域名教程(域名购买+配置)~
  15. 华山论剑闲谈iOS中闪光灯的使用
  16. PhoneGap移动开发框架
  17. Elasticsearch5基于completion suggester实现提示词(类京东淘宝)
  18. Excel把一个工作表根据条件拆分成多个工作表
  19. Java JPG转TIF文件过大的解决方案(单张解决方案,多张可看以下参考链接)
  20. 开机黑屏且显示the GNU GRUB version grub>命令行解决办法

热门文章

  1. python的重试库tenacity用法以及类似库retry、requests实现
  2. Java面向对象之多态(向上、向下转型) 入门实例
  3. 【探路者】10月16日立会报告(团队第1周-第3次)
  4. LeetCode Can I Win
  5. 鼠标移上图标字体,让其旋转
  6. Ugly Numbers UVA - 136
  7. 介绍Unity中相机的投影矩阵与剪切图像、投影概念
  8. Java中的异或(转)
  9. Qt系列教程-yafeilinx Qt入门教程
  10. 不用加好友,查看对方校内照片