求幂运算、多项式乘法及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 --> 302
    public 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 = 16
        long 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;
            else
                result = result * x + c - '0';
        }
        return result;
    }
复制代码

 

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

本文转自hapjin博客园博客,原文链接:http://www.cnblogs.com/hapjin/p/5372930.html,如需转载请自行联系原作者


相关文章
|
消息中间件 前端开发 小程序
一个基于.NET Core构建的简单、跨平台、模块化的商城系统
今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。
245 2
|
1月前
|
Linux API iOS开发
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
168 14
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
|
JSON 安全 前端开发
post为什么会发送两次请求?
post为什么会发送两次请求?
433 70
|
机器学习/深度学习 人工智能 监控
深度学习之模型攻击(Model Attack)详解
模型攻击通常指在机器学习和人工智能领域中,故意设计的行为或方法,旨在操纵或欺骗机器学习模型的输出。这类攻击可能导致模型做出错误的决策或泄露敏感信息,对于安全性至关重要的应用(如金融服务、医疗和自动驾驶)尤其具有破坏性。
617 3
|
弹性计算 大数据 测试技术
阿里云4核8g服务器价格以及收费标准_2024年新版报价
阿里云服务器4核8g配置多少钱一年?1个月费用多少?云服务器u1实例3折优惠价955.58元一年,计算型c7云服务器4核8G价格2944.79元一年。4核8G服务器按月购买比较贵,经济型e实例4核8G配置1个月216元,通用算力型u1服务器336.96元一个月
|
存储 关系型数据库 MySQL
基于SpringBoot+Vue古典舞在线交流平台的设计与实现(源码+部署说明+演示视频+源码介绍+lw)(2)
基于SpringBoot+Vue古典舞在线交流平台的设计与实现(源码+部署说明+演示视频+源码介绍+lw)
212 1
|
Linux 虚拟化 iOS开发
EVE-NG安装设备组件
EVE-NG实际上是一个Linux虚拟机,上面运行各种网络设备对EVE来说也是虚拟机,但是安装起来要简单得多。
组合逻辑电路( Combinational Logic Circuit)知识点总结-3
组合逻辑电路( Combinational Logic Circuit)知识点总结
|
存储 人工智能 自然语言处理
论文介绍:Mamba:线性时间序列建模与选择性状态空间
【5月更文挑战第11天】Mamba是新提出的线性时间序列建模方法,针对长序列处理的效率和内存问题,采用选择性状态空间模型,只保留重要信息,减少计算负担。结合硬件感知的并行算法,优化GPU内存使用,提高计算效率。Mamba在多种任务中展现出与Transformer相当甚至超越的性能,但可能不适用于所有类型数据,且硬件适应性需进一步优化。该模型为长序列处理提供新思路,具有广阔应用前景。[论文链接](https://arxiv.org/abs/2312.00752)
504 3
|
小程序 安全 API
微信支付-全面详解(学习总结---从入门到深化)(上)
微信支付(https://pay.weixin.qq.com)是腾讯集团旗下中国领先 的第三方支付平台,一直致力于为用户和企业提供安全、便捷、专业的在线支付服务。
1295 0
微信支付-全面详解(学习总结---从入门到深化)(上)