快速幂(非递归)

简介: 快速幂(非递归)

题目

已知今天是星期六,请问20^22天后是星期几?

注意用数字1到7表示星期一到星期日。

常规思路(非比赛时使用)

如果大家用java写算法的话,我们知道有这么一个数学类的函数Math.pow(a, b);它能计算a的b次方,并以double类型返回结果,此时我们只需要用得到的结果取模7即可,

代码如下(Java):

public class Main{
   public static void main(String[] args) {
       double pow = Math.pow(20, 22);
        int v = (int) pow % 7;
        System.out.println(v + 6);
    }
}

虽然这样也能做,但是还有更优解,我们利用二进制来优化题解。

快速幂解题(比赛推荐)

解题思路:快速幂的思想:

①把指数想象成二进制的表示方式;

②如果指数不等于0,则判断最后一位是否为1(&),如果是,则用结果变量result 乘 底数 并取模(根据题意设定模的大小),否则不能乘,因为0 * result = 0;

③每进行一次,底数 = 底数 * 底数 % 模 (将指数表示为二进制之后,底数应该对应每次的指数),

即 a的1次 a的2次 a的4次 a的8次 (同底数相乘,指数相加,正好对应二进制的每一位),

例如:20的3次方(3的二进制为11)= 20的(2的1次方)次方 * 20的(2的0次方)次方;

④将指数往右边移动一位,方便进行下一次的判断

⑤其实到这里,快速幂的思想分析已然结束,但是格外的取模操作让人感到不太理解(不考虑数据溢出的情况下可以不取模),为什么每次都可以取模?其实只要是乘法,不论何时取模都是一样的,可以参考 以下公式:

例如:(a * b)% c = (a % c) * (b % c); --> (5 * 6) % 4 = ( 5 % 4) * (6 % 4) = 2

代码如下(Java):

import java.io.*;
public class Main {
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static int mod = 7;
    public static void main(String[] args) throws IOException {
        bw.write(String.valueOf(FastPower(20, 22) + 6));
        bw.flush();
        bw.close();
    }
    public static int FastPower(int a, int b) {
    int res = 1;
    while (b != 0) {
        if ((b & 1) == 1) {//如果满足条件,则相乘
            res = res * a % mod;
        }
        //无论如何,a都要不断倍增,b都要不断右移
        a *= a % mod;
        b = b >> 1;
    }
    return res;
}

总结

快速幂是经典的数论题目,通过二进制和取模的方式,极大的简化了计算!

文章粗浅,希望对大家有帮助!

相关文章
|
编解码 物联网
LDPC 码在 3GPP 中的应用 | 带你读《5G-NR信道编码》之十八
本章节带你了解LDPC 码在 3GPP 中的应用。
LDPC 码在 3GPP 中的应用  | 带你读《5G-NR信道编码》之十八
|
前端开发
【HTML实战】把爱心代码放在自己的网站上是一种什么体验?
【HTML实战】把爱心代码放在自己的网站上是一种什么体验?
|
12月前
长上下文能取代RAG吗?
【10月更文挑战第28天】本文探讨了检索增强生成(RAG)和长上下文(LC)在大型语言模型(LLMs)中的应用。RAG通过检索外部信息扩展LLM的知识范围,而LC则直接处理长文本。研究发现,LC在性能上通常优于RAG,但在处理超过模型上下文窗口的文本时,RAG表现出优势。此外,RAG在成本上更具优势。基于此,作者提出了Self-Route方法,结合RAG和LC的优点,实现性能和成本的最佳平衡。
162 7
|
Java 开发工具 Android开发
搭建大型源码阅读环境——使用 OpenGrok
RTFSC 是程序员成长的必修课,营造舒适的环境至关重要。本文介绍了阅读大型源码(如 AOSP)的工具选择,重点推荐了免费开源的 OpenGrok。OpenGrok 提供快速搜索、版本历史查看、语法高亮等功能,适用于特大型项目。文章还详细讲解了 OpenGrok 的安装和配置步骤,帮助读者高效阅读源码。
2321 6
|
SQL 关系型数据库 数据库
数据库空间之谜:彻底解决RDS for SQL Server的空间难题
【8月更文挑战第16天】在管理阿里云RDS for SQL Server时,合理排查与解决空间问题是确保数据库性能稳定的关键。常见问题包括数据文件增长、日志文件膨胀及索引碎片累积。利用SQL Server的动态管理视图(DMV)可有效监测文件使用情况、日志空间及索引碎片化程度。例如,使用`sp_spaceused`检查文件使用量,`sys.dm_db_log_space_usage`监控日志空间,`sys.dm_db_index_physical_stats`识别索引碎片。同时,合理的备份策略和文件组设置也有助于优化空间使用,确保数据库高效运行。
323 2
|
数据采集 机器学习/深度学习 算法
|
存储 前端开发 JavaScript
React Hooks的魔法:如何在组件世界里施展响应式与复用的魔法
【8月更文挑战第27天】React Hooks 是自 React 16.8 起新增的功能,支持开发者在无需类组件的情况下利用 React 的状态管理和特性。本文通过实例展示了多种核心 Hooks 的使用方法:`useState` 用于实现响应式状态管理;`useEffect` 处理副作用操作,如数据获取等;`useMemo` 和 `useCallback` 有助于性能优化;`useRef` 则提供对 DOM 的直接引用。
143 2
|
Ubuntu
Ubuntu22.04,AOSP编译报错: libncurses.so.5: cannot open shared object file: No such file
本文描述了在Ubuntu 22.04系统上编译AOSP时遇到的`libncurses.so.5`缺失错误,并提供了通过安装相应库解决该问题的步骤。
2370 0
|
JavaScript 前端开发 中间件
Express框架搭建项目 node.js
【6月更文挑战第3天】这篇文章是关于使用Express框架构建Node.js Web应用的教程。Express是一个轻量级、功能丰富的框架,特点包括简洁灵活的核心、强大的中间件支持、灵活的路由系统和模板引擎兼容性。文章介绍了如何安装Express,并通过一个简单的示例展示了如何创建一个基本的Web服务器。最后,鼓励读者继续学习和实践,以充分利用Express和Node.js的能力。
289 1
阿里云公网IP地址多少钱一个?
阿里云公网IP价格因地域而异,如华北1(青岛)包年包月约20.70元/月,华北2(北京)及其他地区23元/月,香港30元/月,新加坡23元/月。按量付费模式下,保有费0.020元/小时,流量额外计费。
3347 0
阿里云公网IP地址多少钱一个?
下一篇
开通oss服务