• 秦九韶算法c++


    直接切入正题:

    对于一个函数: f ( x ) = a n x n + a n − 1 x n − 1 + a n − 2 x n − 2 + ⋯ + a 1 x + a 0 f(x) = a_nx^n + a_{n - 1}x^{n - 1} + a_{n - 2}x^{n - 2} + \dots+a_1x + a_0 f(x)=anxn+an1xn1+an2xn2++a1x+a0

    给定 a n , a n − 1 … a 0 a_n, a_{n - 1}\dots a_0 an,an1a0 x x x,求出 f ( x ) f(x) f(x) 的值。

    题目描述

    如题。

    输入格式

    输入共两行,第一行为 n n n x x x

    第二行 n + 1 n + 1 n+1 个整数,表示 a n a_n an a 0 a_0 a0

    输出格式

    一行一个整数,表示 f ( x ) f(x) f(x)

    样例输入

    3 2
    1 2 3 4
    
    • 1
    • 2

    样例输出

    26
    
    • 1

    算法分析:

    1. 普通算法
      直接暴力求解,程序如下:
    #include 
    #include 
    #include 
    #define L unsigned long long
    #define ll long long
    #define I unsigned int
    #define endl '\n'
    #define ref(i, a, b, p) for (signed(i) = (a); (i) <= signed(b); (i) += signed(p))
    #define gef(i, a, b, p) for (signed(i) = (a); (i) >= signed(b); (i) -= signed(p))
    using namespace std;
    
    int a[1005], x, n;
    ll ans;
    
    void work()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
    
        cin >> n >> x;
        gef (i, n, 0, 1)
            cin >> a[i];
        ref (i, 0, n, 1)
            ans += a[i] * pow(x, i);	// 如题,直接计算即可
        cout << ans << endl;
    
        return ;
    }
    
    int main()
    {
        work();
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    1. 秦九韶算法

    对于这个式子: f ( x ) = a n x n + a n − 1 x n − 1 + a n − 2 x n − 2 + ⋯ + a 1 x + a 0 f(x) = a_nx^n + a_{n - 1}x^{n - 1} + a_{n - 2}x^{n - 2} + \dots+a_1x + a_0 f(x)=anxn+an1xn1+an2xn2++a1x+a0,我们对它进行一些变形:
    f ( x ) = a n x n + a n − 1 x n − 1 + a n − 2 x n − 2 + ⋯ + a 1 x + a 0    = ( a n x n − 1 + a n − 1 x n − 2 + ⋯ + a 1 ) x + a 0 f(x) = a_nx^n + a_{n - 1}x^{n - 1} + a_{n - 2}x^{n - 2} + \dots+a_1x + a_0 \\\qquad\;=(a_nx^{n - 1} + a_{n - 1}x^{n - 2} + \dots + a_1)x + a_0 f(x)=anxn+an1xn1+an2xn2++a1x+a0=(anxn1+an1xn2++a1)x+a0

    之后不断提公因数 x x x,得到如下式子:

    f ( x ) = ( … ( ( a n x + a n − 1 ) x + a n − 2 ) ⋯ + a 1 ) x + a 0 f(x) = (\dots((a_nx + a_{n - 1})x + a_{n-2})\dots+a_1)x + a_0 f(x)=(((anx+an1)x+an2)+a1)x+a0

    这就是 秦九韶算法

    代码实现:

    #include 
    #include 
    #include 
    #define L unsigned long long
    #define ll long long
    #define I unsigned int
    #define endl '\n'
    #define ref(i, a, b, p) for (signed(i) = (a); (i) <= signed(b); (i) += signed(p))
    #define gef(i, a, b, p) for (signed(i) = (a); (i) >= signed(b); (i) -= signed(p))
    using namespace std;
    
    int a[1005], x, n;
    ll ans;
    
    void work()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
    
        cin >> n >> x;
        gef(i, n, 0, 1)
            cin >> a[i];
        ans = a[n];
        gef(i, n, 1, 1)
            ans = ans * x + a[i - 1];
        cout << ans << endl;
    
        return;
    }
    
    int main()
    {
        work();
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    使用dumuz工具实现淘宝收藏的宝贝批量下载(批量导出)
    PicoRV32-on-PYNQ-Z2: An FPGA-based SoC System——RISC-V On PYNQ项目复现
    实现Runnable接口
    境电商为什么要做独立站?API一键对接秒上架瞬间拥有全平台几十亿商品和用户!
    LeetCode 1175. 质数排列(质数判断+组合数学)
    实例说明接口测试的关键是什么?(含文档+视频)
    学习java的第二十七天。。。(输入输出流)
    基于lightgbm的金融风控算法实践(Python版)
    3DTile是不是没有坐标的选择?
    行业快讯 | 2022国际嵌入式展展示了哪些新技术?
  • 原文地址:https://blog.csdn.net/qi_programmer/article/details/127883004