一,两种不同的求幂运算

求解x^n(x 的 n 次方)

①使用递归,代码如下:

 1     private static long pow(int x, int n){
 2         if(n == 0)
 3             return 1;
 4         if(n == 1)
 5             return x;
 6         if(n % 2 == 0)
 7             return pow(x * x, n / 2);
 8         else
 9             return pow(x * x, n / 2) * x;
10     }

分析:

每次递归,使得问题的规模减半。2到6行操作的复杂度为O(1),第7行pow函数里面的x*x操作复杂度为O(1)

故时间复杂度公式:T(N)=T(N/2)+O(1)   =>   T(N)=O(logN)

②普通方式求幂

1     private static long pow2(int x, int n){
2         if(x == 0)
3             return 0;//0^n == 0
4         long p = 1;
5         for(int i = 0; i < n; i++)
6             p *= x;
7         return p;
8     }

显然,时间复杂度为O(N)

二,求解多项式乘法

公式:f(x,n) = a(0)x^0 + a(1)x^1 + a(2)x^2+...+a(n)x^n

比如:f(10,4)=a(0)10^0 + a(1)10^1 + a(2)10^2 + a(3)10^3+a(4)10^4

代码如下:

 1     public static long poly(int[] arr, int x, int n){
 2         long sum = 0;
 3         for(int i = 0; i <= n; i++){
 4             sum += arr[i] * pow(x, i);
 5         }
 6         return sum;
 7     }
 8
 9     private static long pow(int x, int n){
10         if(n == 0)
11             return 1;
12         if(n == 1)
13             return x;
14         if(n % 2 == 0)
15             return pow(x * x, n / 2);
16         else
17             return pow(x * x, n / 2) * x;
18     }

Horner法则求解多项式乘法,参考:

1     public static long poly2(int[] arr, int x, int n){//arr存储系数, x 表示基数, n 表示幂
2         long poly = 0;
3         for(int i = n; i >= 0; i--)
4             poly = poly * x + arr[i];
5         return poly;
6     }

对比采用Horner法则计算多项式乘法与这篇文章: 字符串转换成数字

1 public int atoi(char[] s){
2         int result = 0;
3         for(int i = 0; i < s.length; i++)
4             result = result * 10 + s[i] - '0';// 相当于 poly2(...)中的 x=10
5         return result;
6     }

可以看出,二者有很大的相似性。其实,不难看出,字符串转换成数字使用的正是Horner法则。

由此,得到启发,在进制转换中,如:八进制转十进制,相当于 x = 8。

故可写出一个常用的进制转换程序,如下:

    //x 表示进制, 若x=8,表示将8进制转换成10进制public static long convert(char[] arr, int x){long result = 0;for(int i = 0; i < arr.length; i++)result = result * x + arr[i] - '0';return result;}//str 表示原来进制的数,如:convert("456", 8) 456 --> 302public static long convert2(String str, int x){long result = 0;for(int i = 0; i < str.length(); i++)result = result * x + Integer.valueOf(str.charAt(i) - '0');return result;}

十六进制转十进制,相当于 x = 16。

    public static long convert2(String str, int x){//x = 16long result = 0;char c;str = str.toUpperCase();//"abF8"-->"ABF8"for(int i = 0; i < str.length(); i++){c = str.charAt(i);if(c >= 'A' && c <= 'F')result = result * x + (c - 'A') + 10;elseresult = result * x + c - '0';}return result;}

因此,进制转换、字符串转换成数字、多项式求值都可以使用Horner法则来求解。

转载于:https://www.cnblogs.com/hapjin/p/5372930.html

求幂运算、多项式乘法及Horner法则的应用相关推荐

  1. 《算法基础》——2.3 求幂运算

    本节书摘来自华章计算机<算法基础>一书中的第2章,第2.3节,作者:(美)罗德·斯蒂芬斯(Rod Stephens)著,更多章节内容可以访问云栖社区"华章计算机"公众号 ...

  2. 数据结构与算法:快速幂——求幂运算 O(logN)

    前言:普通的求幂问题,相信大家已经屡见不鲜,无非就是 纯暴力 解法,或者直接调用公式:Math.Pow(底数, 指数)  一步得出.但这两种算法只能使得时间复杂度保持在 O(n).而且公式一步的得往往 ...

  3. 大数运算(8)——大数幂运算

    大数幂运算的实现有了前面的大数乘法算法做铺垫,就是调用乘法函数,来循环去自乘,幂指数相应减1,直到幂指数变为0时结束. 下面是C语言代码实现: #include<stdio.h> #inc ...

  4. 数值分析 | 多项式求值(Horner法则)

    Horner法则 又名秦九韶算法或嵌套乘法,是一种高效的多项式求值算法. 对于 n n n次多项式 f ( x ) = a 0 + a 1 x + . . . + a n − 1 x n − 1 + ...

  5. [2021CCPC 威海G] Shinyruo and KFC (下降幂多项式乘法+下降幂转普通幂+多项式多点求值)

    题意 给定 n n n 个正整数 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1​,a2​,⋯,an​,并给定正整数 m m m,对于每个 k ∈ [ 1 , m ...

  6. 解题报告(二)多项式问题(多项式乘法及其各种运算)(ACM/ OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  7. AtCoder AGC019E Shuffle and Swap (DP、FFT、多项式求逆、多项式快速幂)

    题目链接 https://atcoder.jp/contests/agc019/tasks/agc019_e 题解 tourist的神仙E题啊做不来做不来--这题我好像想歪了啊= =-- 首先我们可以 ...

  8. 2.2 多项式乘法与加法运算(线性结构,C)

    多项式乘法与加法运算 设计函数分别求两个一元多项式的乘积与和 题意理解 题意理解 和 积 求解思路 多项式表示 两种表示方式 在事先已经知道具体多少项的时候,本题较好的实现方法:==动态数组== 链表 ...

  9. 【数字信号处理】卷积编程实现 ( Matlab 卷积和多项式乘法 conv 函数 | 使用 matlab 代码求卷积并绘图 )

    文章目录 一.Matlab 卷积和多项式乘法 conv 函数 二.使用 matlab 代码求卷积并绘图 一.Matlab 卷积和多项式乘法 conv 函数 Matlab 文档地址 : https:// ...

最新文章

  1. VTK:绘制截锥体用法实战
  2. G6 图可视化引擎——核心概念——节点/边/Combo——内置节点——Circle
  3. 使用abapGit在ABAP On-Premises系统和SAP云平台ABAP环境之间进行代码传输
  4. jmeter报“msg“:“Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“的解决方法
  5. [Flex] flex的安全沙箱,你保障了安全的同时也害苦了多少我这样的人那
  6. Call for Speaker!Flink Forward 全球在线会议议题征集 ing
  7. Python安装包下载、环境配置与工具包安装教程(详细版)
  8. ubuntu安装jdk出现的问题Failed to extract the files
  9. java秒抢商品_Java秒杀系统实战系列~待秒杀商品列表与详情功能开发
  10. 虚拟内存页面置换算法c语言,5虚拟内存,页面置换算法
  11. 锐浪报表 Grid++Report PrintPreview 显示模式
  12. 用 Amazon Web Services 进行云计算,第 3 部分:用 EC2 根据需要提供服务器
  13. Flutter图片宽高获取
  14. 给学妹写C程——中国海洋大学C语言程序设计课作业(一)
  15. 实战:战狼2票房数据分析——(2)票房数据构造及保存
  16. 海思3559A的一些工具探索尝试
  17. kibana KQL语法实例
  18. 中软国际实习 dzy15
  19. 基于C#制作一个飞机大战小游戏
  20. 小程序毕业设计 基于微信医院预约挂号小程序毕业设计开题报告功能参考

热门文章

  1. Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决...
  2. C: Answers to “The C programming language, Edition 2”
  3. 关于clientWidth、offsetWidth、clientHeight、offsetHeigh
  4. 【FJOI2015】最小覆盖双圆问题
  5. mybatis查询时间段sql语句
  6. with...as...
  7. 推荐一本书给大家《不懂带人 你就自己做到死》
  8. oracle 操作表
  9. javascript 模式学习篇---基础
  10. 计算机基础课程教学创新,计算机基础课程教学学生创新能力的培养-计算机基础论文-计算机论文(12页)-原创力文档...