• 秦九韶算法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
  • 相关阅读:
    手把手教你Nginx常用模块详解之ngx_http_addition_module(二)
    【LeetCode 每日一题】15. 三数之和
    【java学习】特殊流程控制语句(8)
    新概念英语(第二册)复习——Lesson 6 - Lesson10
    shell-whiptail代码如何实现调用新终端并执行命令运行程序
    Cisco switch常用命令
    Integer超出-128——127范围的数值比较为什么要用equals
    【翻译】Fast Patch-based Style Transfer of Arbitrary Style
    Spring Boot 多数据源配置
    损失函数篇 | YOLOv8 更换损失函数之 MPDIoU | 《2023 一种用于高效准确的边界框回归的损失函数》
  • 原文地址:https://blog.csdn.net/qi_programmer/article/details/127883004