一,两种不同的求幂运算

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

①使用递归,代码如下:

     private static long pow(int x, int n){
if(n == 0)
return 1;
if(n == 1)
return x;
if(n % 2 == 0)
return pow(x * x, n / 2);
else
return pow(x * x, n / 2) * x;
}

分析:

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

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

②普通方式求幂

     private static long pow2(int x, int n){
if(x == 0)
return 0;//0^n == 0
long p = 1;
for(int i = 0; i < n; i++)
p *= x;
return p;
}

显然,时间复杂度为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

代码如下:

     public static long poly(int[] arr, int x, int n){
long sum = 0;
for(int i = 0; i <= n; i++){
sum += arr[i] * pow(x, i);
}
return sum;
} private static long pow(int x, int n){
if(n == 0)
return 1;
if(n == 1)
return x;
if(n % 2 == 0)
return pow(x * x, n / 2);
else
return pow(x * x, n / 2) * x;
}

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

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

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

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

可以看出,二者有很大的相似性。其实,不难看出,字符串转换成数字使用的正是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法则来求解。

求幂运算、多项式乘法及Horner法则的应用的更多相关文章

  1. FFT求卷积(多项式乘法)

    FFT求卷积(多项式乘法) 卷积 如果有两个无限序列a和b,那么它们卷积的结果是:\(y_n=\sum_{i=-\infty}^\infty a_ib_{n-i}\).如果a和b是有限序列,a最低的项 ...

  2. 小白专场-多项式乘法与加法运算-python语言实现

    目录 题意理解 解题思路 多项式加法 多项式乘法 完整代码 题意理解 题目: 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一 ...

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

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

  4. [笔记]ACM笔记 - 利用FFT求卷积(求多项式乘法)

    卷积 给定向量:, 向量和: 数量积(内积.点积): 卷积:,其中 例如: 卷积的最典型的应用就是多项式乘法(多项式乘法就是求卷积).以下就用多项式乘法来描述.举例卷积与DFT. 关于多项式 对于多项 ...

  5. 二分求幂/快速幂取模运算——root(N,k)

    二分求幂 int getMi(int a,int b) { ; ) { //当二进制位k位为1时,需要累乘a的2^k次方,然后用ans保存 == ) { ans *= a; } a *= a; b / ...

  6. 牛顿迭代,多项式求逆,除法,开方,exp,ln,求幂

    牛顿迭代 若 \[G(F_0(x))\equiv 0(mod\ x^{2^t})\] 牛顿迭代 \[F(x)\equiv F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}(mod ...

  7. [BZOJ3684][拉格朗日反演+多项式求幂]大朋友和多叉树

    题面 Description 我们的大朋友很喜欢计算机科学,而且尤其喜欢多叉树.对于一棵带有正整数点权的有根多叉树,如果它满足这样的性质,我们的大朋友就会将其称作神犇的:点权为\(1\)的结点是叶子结 ...

  8. 求幂&&快速幂&&位运算

    1.普通的求幂方法: 时间复杂度为O(n),对于比较大的数在1s限时内可能会TLE int pow(int base,int p){ int ans=1; for(int i=1;i<=p;i+ ...

  9. 【luogu P3803】【模板】多项式乘法(FFT)

    [模板]多项式乘法(FFT) 题目链接:luogu P3803 题目大意 给你两个多项式,要你求这两个多项式乘起来得到的多项式.(卷积) 思路 系数表示法 就是我们一般来表示一个多项式的方法: \(A ...

随机推荐

  1. [转帖]论iPhone处理器十年进化史

    论iPhone处理器十年进化史 导读: 今天,苹果发布了最新一代的iPhone,作为新一代的旗舰,新手机的功能承载了苹果对未来的希望和消费者的期待.但从我们半导体人看来更关注的是内部技术的演变,尤其是 ...

  2. Laravel Eloquent ORM 时如何查询表中指定的字段

    导读:在使用Laravel ORM的Model方法find, get, first方法获取数据对象时返回的数据对象的attributes属性数组里会包含数据表中所有的字段对应...原文地址:http: ...

  3. Java微信二次开发(七)

    自定义菜单 第一步:新建包com.wtz.menu,新建类Button.java package com.wtz.menu; /** * @author wangtianze QQ:864620012 ...

  4. VS2008中英文转换

    设置Visual Studio的语言: 工具=>选项=>环境=>区域设置=>语言 如图: 对于英文不好的朋友还是挺好用的

  5. 同步工具:CountDownLatch、CyclicBarrier和Semaphore

    1. CountDownLatch 1.1 功能及使用场景 一个同步工具,使得一个或多个线程等待一组线程执行完成后再执行. 使用场景:等待一些前置任务执行完成后,再执行特定的功能.比如,系统启动时,各 ...

  6. Bootstrap排版——HTML元素的样式重定义

    前面的话 Bootstrap对默认的HTML元素进行了CSS样式定义,使得各种基本结构套用出来的HTML页面更加美观.本文将详细介绍Bootstrap中排版相关的内容 标题 [h] HTML 中的所有 ...

  7. BZOJ3772精神污染——可持久化线段树+出栈入栈序

    题目描述 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户 ...

  8. hdu 6394 Tree (2018 Multi-University Training Contest 7 1009) (树分块+倍增)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=6394 思路:用dfs序处理下树,在用分块,我们只需要维护当前这个点要跳出这个块需要的步数和他跳出这个块去 ...

  9. bzoj2142: 礼物

    2142: 礼物 Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E心目中的重要性不同,在小E心中分量越重的人,收到的礼物会 ...

  10. Leetcode 461.汉明距离 By Python

    两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目. 给出两个整数 x 和 y,计算它们之间的汉明距离. 注意: 0 ≤ x, y < 231. 示例: 输入: x = 1, y ...