秦九韶算法

这应该是笔者写的第一道多项式有关的题目
没办法,我实在是太菜了
就是这道题
题面已经写的很露骨了
但是如果你拿传统的枚举每个i去带入,并且你使用了快读+吸氧等一系列的优化,你就可以获得30pts的好成绩
如果你开了高精度,那就是50pts
所以正解就是秦九韶算法(第一眼我还以为是海伦——秦九韶公式……)
我谷的题解说人教数学书必修三封面有,我怎么没看到?
反正就是用他啦~

内容

先给出一个一元三次多项式:
f(x)=i=03(i+1)×xi
对于他,我们有这样的一个答案:
ans=x×(x×(4×x+3)+2)+1
然后我们推广到一元n次多项式:
f(x)=i=0n(i+1)×xi
那就应该是:
ans=((((a[n])×x+a[n1])×x+a[n2])×x...+a1)×x+a0

优化

如果使用朴素算法求解第一个式子的话,我们需要6次乘法与3次加法
那么对于第二个式子就是n(n+1)2次乘法与n×1=n次加法
所以时间复杂度就是O(n2)这显然是无法接受的
而我们使用秦九韶算法由内向外逐层计算多项式的值
就可以将时间复杂度优化到O(n)这个级别。

实现

我们把百度百科上的代码直接粘过来吧:

秦九韶算法
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
int main() {
    int n;
    cout << "请输入多项式的次数 :";
    cin >> n;
    double *a = new double[n+1];//n次多项式申请n+1大小的数组
    cout << "请输入多项式的系数(最高次项开始):" << endl;
    for(int i = n; i >= 0; i --)
        cin >> a[i];//读入各项系数
    double x0,ans=a[n];
    cout << "请输入 X0 " << endl;
    cin >> x0;
    for(int i = n-1;i >= 0;i --)
        ans = ans*x0 + a[i];//最高次项开始,往外展开
    cout << "多项式在X0出的函数值为:" << ans << endl;
    delete []a;//释放动态内存
    return 0;
}
posted @   Merlin·Lee  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示