秦九韶算法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

样例输出

26

算法分析:

  1. 普通算法
    直接暴力求解,程序如下:
#include <cmath>
#include <iostream>
#include <algorithm>
#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. 秦九韶算法

对于这个式子: 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 <cmath>
#include <iostream>
#include <algorithm>
#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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值