求幂运算、多项式乘法及Horner法则的应用
一,两种不同的求幂运算
求解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法则的应用相关推荐
- 《算法基础》——2.3 求幂运算
本节书摘来自华章计算机<算法基础>一书中的第2章,第2.3节,作者:(美)罗德·斯蒂芬斯(Rod Stephens)著,更多章节内容可以访问云栖社区"华章计算机"公众号 ...
- 数据结构与算法:快速幂——求幂运算 O(logN)
前言:普通的求幂问题,相信大家已经屡见不鲜,无非就是 纯暴力 解法,或者直接调用公式:Math.Pow(底数, 指数) 一步得出.但这两种算法只能使得时间复杂度保持在 O(n).而且公式一步的得往往 ...
- 大数运算(8)——大数幂运算
大数幂运算的实现有了前面的大数乘法算法做铺垫,就是调用乘法函数,来循环去自乘,幂指数相应减1,直到幂指数变为0时结束. 下面是C语言代码实现: #include<stdio.h> #inc ...
- 数值分析 | 多项式求值(Horner法则)
Horner法则 又名秦九韶算法或嵌套乘法,是一种高效的多项式求值算法. 对于 n n n次多项式 f ( x ) = a 0 + a 1 x + . . . + a n − 1 x n − 1 + ...
- [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 ...
- 解题报告(二)多项式问题(多项式乘法及其各种运算)(ACM/ OI)超高质量题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- AtCoder AGC019E Shuffle and Swap (DP、FFT、多项式求逆、多项式快速幂)
题目链接 https://atcoder.jp/contests/agc019/tasks/agc019_e 题解 tourist的神仙E题啊做不来做不来--这题我好像想歪了啊= =-- 首先我们可以 ...
- 2.2 多项式乘法与加法运算(线性结构,C)
多项式乘法与加法运算 设计函数分别求两个一元多项式的乘积与和 题意理解 题意理解 和 积 求解思路 多项式表示 两种表示方式 在事先已经知道具体多少项的时候,本题较好的实现方法:==动态数组== 链表 ...
- 【数字信号处理】卷积编程实现 ( Matlab 卷积和多项式乘法 conv 函数 | 使用 matlab 代码求卷积并绘图 )
文章目录 一.Matlab 卷积和多项式乘法 conv 函数 二.使用 matlab 代码求卷积并绘图 一.Matlab 卷积和多项式乘法 conv 函数 Matlab 文档地址 : https:// ...
最新文章
- VTK:绘制截锥体用法实战
- G6 图可视化引擎——核心概念——节点/边/Combo——内置节点——Circle
- 使用abapGit在ABAP On-Premises系统和SAP云平台ABAP环境之间进行代码传输
- jmeter报“msg“:“Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“的解决方法
- [Flex] flex的安全沙箱,你保障了安全的同时也害苦了多少我这样的人那
- Call for Speaker!Flink Forward 全球在线会议议题征集 ing
- Python安装包下载、环境配置与工具包安装教程(详细版)
- ubuntu安装jdk出现的问题Failed to extract the files
- java秒抢商品_Java秒杀系统实战系列~待秒杀商品列表与详情功能开发
- 虚拟内存页面置换算法c语言,5虚拟内存,页面置换算法
- 锐浪报表 Grid++Report PrintPreview 显示模式
- 用 Amazon Web Services 进行云计算,第 3 部分:用 EC2 根据需要提供服务器
- Flutter图片宽高获取
- 给学妹写C程——中国海洋大学C语言程序设计课作业(一)
- 实战:战狼2票房数据分析——(2)票房数据构造及保存
- 海思3559A的一些工具探索尝试
- kibana KQL语法实例
- 中软国际实习 dzy15
- 基于C#制作一个飞机大战小游戏
- 小程序毕业设计 基于微信医院预约挂号小程序毕业设计开题报告功能参考
热门文章
- Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决...
- C: Answers to “The C programming language, Edition 2”
- 关于clientWidth、offsetWidth、clientHeight、offsetHeigh
- 【FJOI2015】最小覆盖双圆问题
- mybatis查询时间段sql语句
- with...as...
- 推荐一本书给大家《不懂带人 你就自己做到死》
- oracle 操作表
- javascript 模式学习篇---基础
- 计算机基础课程教学创新,计算机基础课程教学学生创新能力的培养-计算机基础论文-计算机论文(12页)-原创力文档...