目录

一.快速幂

1.问题的引入

2.快速幂的介绍

3.核心思想

4.代码实现

二.Pow(x, n)

1.题目描述

2.问题分析

3.代码实现

三.猴子碰撞的方法数

1.题目描述

2.问题分析

3.代码实现


一.快速幂

1.问题的引入

问题:求解num的n次幂,结果需要求余+7

对于这个问题我们可能就是直接调用函数pow(a,b)来直接求解a的b次幂问题,但是如果求解的结果很大,超过的double的数值范围,我们要求对最终的结果求余+7,我们如果直接调用pow()函数的话,求解出来的数已经超出了double的最大范围,根本无法求出,这个时候我们是否可以考虑在求解的过程中每一次的结果都求余+7,而不是只在最终的结果求余+7这样最终的结果肯定是小于+7,一定不会超出最大的范围.

2.快速幂的介绍

快速幂:快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N),与朴素的O(N)相比效率有了极大的提高。

3.核心思想

例如计算,10的二进制为1010,相当于求解次方

=3*3*3*3*3*3*3*3*3*3

=(3*3)*(3*3*3*3*3*3*3*3)

=*

相当于我们每次对10的二进制的每一个位置求权(如果是二进制这个位是1),则乘以当前的叠加的数,

例如进行求余的步骤 :

定义变量ans保存的结果   1010位10的二进制表达方式

1010的第一位为0,这个时候num=num*num=;    二进制形式为:

1010的第二位为0,这个时候求权为1,ans=ans*num=  num=num*num=;二进制形式为:

1010的第三位为0,这个时候num=num*num=; 二进制形式为:

1010的第四位为1,这个时候求权为1,ans=ans*num=*  num=num*num=;

4.代码实现

1.求余+7的版本,返回数据类型为int的结果

    public int quickPow(long num,int n){long ans=1;long mod=1000000007;while(n!=0){if((n&1)==1)ans=(ans*num)%mod;num = num * num % mod;n>>=1;}return (int)(ans%mod);}

2.不求余的版本,返回数据类型为long的结果

    public long quickPow(long num,int n){long ans=1;while(n!=0){if((n&1)==1)ans=ans*num;num = num * num;n>>=1;}return ans;}

二.Pow(x, n)

1.题目描述

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。

力扣:力扣

2.问题分析

这其实就是一道典型的快速幂的问题,和我们之前不一样的是n可能为负数,负数其实就是,可以转化为n为正数的情况,这样就很好求解了

3.代码实现

    public double myPow(double x, int n) {double res = 1;if(n<0){x=1/x;n=-n;}while (n != 0) {if ((n & 1) == 1) {res *= x;}x *= x;n >>>= 1;}return res;}

三.猴子碰撞的方法数

1.题目描述

现在有一个正凸多边形,其上共有 n 个顶点。顶点按顺时针方向从 0n - 1 依次编号。每个顶点上 正好有一只猴子 。下图中是一个 6 个顶点的凸多边形。

每个猴子同时移动到相邻的顶点。顶点 i 的相邻顶点可以是:

  • 顺时针方向的顶点 (i + 1) % n ,或
  • 逆时针方向的顶点 (i - 1 + n) % n

如果移动后至少有两个猴子位于同一顶点,则会发生 碰撞

返回猴子至少发生 一次碰撞 的移动方法数。由于答案可能非常大,请返回对 109+7 取余后的结果。

注意,每只猴子只能移动一次。

力扣: 力扣

2.问题分析

正难则反,题目问的是至少发生一次碰撞的移动次数,我们不妨把问题转换为求解猴子一次都不碰撞的次数,猴子一共有2的n次幂中跳跃的方式,求中有两种是一次都不碰撞的,一种是猴子全部顺时针进行跳跃,一种是猴子逆时针进行跳跃,所以猴子至少发生一次碰撞的次数=猴子总共的移动次数-2

3.代码实现

    public int monkeyMove(int n) {long ans=1,a=2;long mod=1000000007;while(n!=0){if((n&1)==1)ans=(ans*a)%mod;a = a * a % mod;n>>=1;}return (int)((ans+mod-2)%mod);}

四.分数求小数

1.题目描述

题目描述
小明在尝试把一些分子为1的分数(1/x)转化为小数。使用普通计算器的除法功能可以实
现,但是保留的小数位数非常有限。而小明希望得到n位小数,而且要从小数点后面第d位
开始的n位小数。例如,x=13,d=4,n=3时,1/13=0.07692307692....,从小数点后第四
位开始取三位数,答案是923。现在小明想要计算一些数更大的情况(2<=x<=10000,
1<=d<=1000000000,1<=n<=10000),请你写个程序帮帮他。
输入描述
一行,三个整数x,d,n,用空格隔开,含义如题干。

输出描述
一行,一个字符串,所取的n位数,不需要隔开。
样例输入
13 4 3
样例输出
923

2.问题分析

3.代码实现

    public static void main(String[] args) {Scanner sc = new Scanner(System.in);long x = sc.nextLong();long d = sc.nextLong();long n = sc.nextLong();long a = 10, b = d - 1;long res = 1;while (b > 0) { // 快速幂if ((b & 1) == 1) {res = res * a % x;}a = a * a % x;b >>= 1;}System.out.println(res);for (long i = d; i < n + d; ++i) {res *= 10;System.out.print(res / x);res %= x;}}

快速幂----快速求解底数的n次幂相关推荐

  1. 二分求幂,快速求解a的b次幂

    一个引子 如何求得a的b次幂呢,那还不简单,一个for循环就可以实现! void main(void) {int a, b;int ans = 1;cin >> a >> b; ...

  2. 快速幂,快速计算底数的 n 次幂

    快速幂,就是快速的计算底数的 n 次幂. 常规求法 int mi(int a, int b) {int res = 1;while (b--){res *= a;}return res; } 时间复杂 ...

  3. 快速幂(快速幂取余)

    引入公式 (a*b) %c = ((a % c)*(b % c)) %c 普通求幂的解法 public static int pow(int x,int n) {int result = 1;for ...

  4. 【牛客每日一题】4.16 逆序对 ( 数学 , 排列组合 ,快速幂 , 快速乘 )

    [每日一题]逆序对 链接:https://ac.nowcoder.com/acm/problem/14731 来源:牛客网 题目描述 求所有长度为n的01串中满足如下条件的二元组个数: 设第i位和第j ...

  5. 光度立体(一)- 基于先验信息的快速表面法向量求解

    基于先验信息的快速表面法向量求解 一.光度立体法简介 二.经典光度立体法求解法向量 三.基于先验信息快速求解法向量 一.光度立体法简介 光度立体法(Photometric Stereo)是一种使用多个 ...

  6. 独家揭秘:快速排名快速暴利的黑 帽seo

    导读:这篇文章如果加一个气势磅礴的开头就完美了,这么好的文章却不适合在行业大站上发布,可惜了,作者黑 帽客雅皮士向大家普及了当今SEO行业的灰色地带:黑 客与黑 帽SEO,让大家了解不为人知的SEO另 ...

  7. C#:实现快速划分/快速分割算法(附完整源码)

    C#:实现快速划分/快速分割算法 int QuickPartition(int[] array, int left, int right, bool isAscend = true) {

  8. 如何用c语言编程幂,c语言编程中如何输入幂次方

    1.头文件:#include 2.原型: double pow(double x, double y); pow() 函数用来求 x 的 y 次幂(次方) pow()用来计算以x 为底的 y 次方值, ...

  9. HDU4549(矩阵快速幂+快速幂)

    f(n)=a^f(n-1) + b^f(n-2):计算矩阵部分用矩阵快速幂:计算a的幂次和b的幂次用快速幂. #include<iostream> #include<algorith ...

最新文章

  1. mysql语句orderby_mysql中的orderby_MySQL
  2. 进入保护模式(一)——《x86汇编语言:从实模式到保护模式》读书笔记12
  3. OpenCASCADE :VTK集成服务(VIS) 之组件架构
  4. 图形处理-几种图像修复方法
  5. Hazelcast发布Jet 0.6版本
  6. sqlite3修改表内容python_python之sqlite3使用详解(转载)
  7. CVPR 2019 | 腾讯AI:做好活体检测,模型重要,数据亦然
  8. RFM模型——构建数据库营销的商业战役!(转)
  9. c语言贪吃蛇游戏的关键技术,C语言的贪吃蛇游戏设计
  10. 京东聚合收银(会员码支付)接口封装C++
  11. 求边界点 -- Python
  12. java秒抢商品_Java秒杀系统实战系列~待秒杀商品列表与详情功能开发
  13. 如何开启BBR算法优化ss
  14. Java 技巧篇-IntelliJ IDEA快捷键设置,格式化代码快捷键
  15. 固态硬盘颗粒:SLC/MLC/TLC区别
  16. 阿里,淘宝,天猫,京东2012年的大概销售额
  17. 音游手台中--EC11编码器的控制[2]
  18. latexkatex@常用符号@符号手写识别
  19. 解决Spring Spring Data JPA 错误: Page 1 of 1 containing UNKNOWN instances
  20. 分享:Vue.js新手入门指南-0518-v1.0张雅慧(续)

热门文章

  1. Java开发关于UI界面_Android开发1:基本UI界面设计——布局和组件
  2. strftime函数python_PyThon中time strftime()函数用法
  3. 程序员的数学读书笔记(全)
  4. Dreamweaver 序列号
  5. 阿里投资新浪:小心步子迈大了扯到蛋
  6. 笔记本装 Win10 后的亮度调节和 WiFi 问题
  7. React-Extension
  8. DO447使用过滤器和插件转换器--使用过滤器处理变量
  9. python中注释的作用_python注释是什么意思
  10. [技术讨论]谈架构设计:如何界定前后端,前端是否需要数据库?