算法研究:一维多项式求值(秦九韶算法)

问题通式:

求指定点X处的函数值。

思路:

运用秦九韶算法

将多项式表述成如下嵌套模式:

于是可以转换成程序语言思想

可通过for循环来实现。

代码实现:

C语言代码如下:

#include <stdio.h>

/*
*函数名:double odpf(double array[], int n, double x)
*参数:double array[] 系数数组
*      int n 表示n项
*      double x x的值
*返回值:计算结果sum
*说明:One dimensional polynomial function 一维多项式求值
*/
double odpf(double array[], int n, double x)
{
    double sum;
    sum = array[n-1];
    for (int i = n - 2; i >= 0; i--){
        sum = sum * x + array[i];
    }
    return sum;
}

int main(){
    double array[100];
    double x;
    int n;

    printf("请输入项数:");
    scanf("%d",&n);

    printf("请输入系数(空格隔开):");
    for (int i = n - 1; i >= 0; i--){
        scanf("%lf",&array[i]);
    }

    while (true){
        printf("请输入x的值:");
        scanf("%lf", &x);

        printf("x = %5.2lf, p(%5.2lf) = %.2lf\n\n", x, x, odpf(array, n, x));
    }  return 0;
}

测试值:

3
1 2 3
2

结果:11.00

6
2 3 1 4 5 3
3

结果:810.00

程序运行结果:

经检验,算法设计正确。

时间: 2024-11-15 09:42:29

算法研究:一维多项式求值(秦九韶算法)的相关文章

多项式求值

一.一维多项式求值: P(x)=3x^6+7x^5+3x^4+3x^3+8x^2+5x+23 一个通用的计算多项式的值的算法可以采用递推的方式.首先可以将上面多项式变形为如下的等价方式: P(x)=(...((an-1x+an-2)x+an-3)x+...+a1)x+a0 通过以上表达式可以看出,只要从里往外逐层按照如下的方式递推,便可以计算得到一个一维多项式的值: Rk=Rk+1*x+ak 具体示例代码如下: 1 /* 2 * @author 3 * 一维多项式求值,从最高一项开始迭代计算 4

多项式计算之秦九韶算法

多项式求值与秦九韶算法 一.引言 多项式函数常常用于描述现实世界的各种规律,而在用计算机计算多项式的值的时候,不同算法的计算时空复杂度通常不一样.如一个n次多项式 f(x)=a[n]x^n+a[n-1]x^(n-1)+......+a[1]x+a[0],我们的常规计算办法是,直接计算,这样我们的时间复杂度为:O(n^2) 下面我们介绍秦九韶算法: 其核心思想:后面每一次计算都依赖于前面计算的结果,这样以减少重复的计算. 简单引例: 计算 x^8 直接算将算8次乘法,而这8次都是必要的吗?显然不是

使用E.W.D.Dijkstra设计算法实现算数表达式求值

要求:编程模拟(1+(2+3)*(4*5))的运算过程,重点在于如何解析由括号运算符和数字组成的字符串,并按照正确的顺序完成各种初级运算符的操作. 实现思路:用两个栈(LIFO)结构来实现(一个用于保存运算符,一个用于保存操作数) 将操作数压如操作数栈 将操作符压如操作符栈 忽略左括号 在遇到右括号时,弹出一个运算符,并弹出所需数量的操作数,并将操作符和操作数的运算结果压到操作数栈 1 package com.luochuang.demo.stdlib; 2 3 public class Eva

基于数值分析思想对多项式求值的原理和应用进行探究

摘要:多项式是由多个单项(符号项如:5x或者常数项4)通过四则运算组合起来的式子,如P(x)=2x^4+3x^3-3x^2+5x-1 一般的求解会将特定的x代入到上式中,一个一个的计算,共需要花费10次的乘法和4次加法运算,但是我们可以通过霍纳方法对多项式进行组合计算,在需要每秒对多个不同输入的x多次计算多项式对应的值时,该方法可以极大的提高计算效率. 原理:采用霍纳方法对上式进行分解步骤如下: P(x) = -1+x(5-3x+3x^2+2x^3) = -1+x(5+x(-3+3x+2x^2)

【算法#4】表达式求值

最讨厌这种造计算器的题了-- 最近被这种造计算器的题坑了几次,一个还是普及-的题.表达式有很多,但是我们在面对狗屎的中缀表达式的时候有没有一些确定的原则? 有.其中一个就是在操作符入操作符栈之前,操作符栈顶的操作符优先级一定得严格低于该操作符优先级,否则弹出操作符并且对操作数栈的栈顶数进行运算直到栈空或者当前优先级严格大于栈顶操作符优先级.当然,前提是你采用这种求值方法,其他的东西暂不予考虑. 首先,我们遇到操作数时,读入操作数并且将操作数加入操作数栈,当我们读入操作符时,弹出操作符栈栈顶元素直

表达式求值相关算法

实现对一个数学表达式的求值,例如:1+2*(3+4) 这个表达式的值为 15 这个问题主要要分为如下几个步骤: 语法分析: 将字符串表达式转化为数字和操作符的 token 数组,['1', '+', '2', '*', '(', '3', '+', '4', ')'] 转逆波兰表达式: 将中缀表达式转后缀表达式,['1', '2', '3', '4', '+', '*', '+'] 逆波兰表达式求值: 15 逆波兰表达式转二叉树: 条件表达式中,二叉树的求值能提前返回,能比逆波兰表达式计算量更少

蓝桥杯 算法提高 递推求值

思路: 矩阵快速幂. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 using namespace std; 5 6 typedef long long ll; 7 typedef vector<ll> vec; 8 typedef vector<vec> mat; 9 10 const int mod = 99999999; 11 12 mat mul(m

4-2 多项式求值

本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑ni=0(a[i]*xi)f(x) 在x点的值. 函数接口定义: double f( int n, double a[], double x ); 其中n是多项式的阶数,a[]中存储系数,x是给定点.函数须返回多项式f(x)的值. 裁判测试程序样例: #include <stdio.h> #define MAXN 10 double f( int n, double a[], double x ); int

4-2 多项式求值 (15分)

本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=\sum_{i=0}^{n}(a[i]\times x^i)f(x)=∑?i=0?n??(a[i]×x?i??) 在x点的值. 函数接口定义: double f( int n, double a[], double x ); 其中n是多项式的阶数,a[]中存储系数,x是给定点.函数须返回多项式f(x)的值. 裁判测试程序样例: #include <stdio.h> #define MAXN 10 double