秦九韶算法c++
创始人
2024-01-28 18:50:06
0

直接切入正题:

对于一个函数:f(x)=anxn+an−1xn−1+an−2xn−2+⋯+a1x+a0f(x) = a_nx^n + a_{n - 1}x^{n - 1} + a_{n - 2}x^{n - 2} + \dots+a_1x + a_0f(x)=an​xn+an−1​xn−1+an−2​xn−2+⋯+a1​x+a0​

给定 an,an−1…a0a_n, a_{n - 1}\dots a_0an​,an−1​…a0​ 及 xxx,求出 f(x)f(x)f(x) 的值。

题目描述

如题。

输入格式

输入共两行,第一行为 nnn 及 xxx。

第二行 n+1n + 1n+1 个整数,表示 ana_nan​ 到 a0a_0a0​。

输出格式

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

样例输入

3 2
1 2 3 4

样例输出

26

算法分析:

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

对于这个式子: f(x)=anxn+an−1xn−1+an−2xn−2+⋯+a1x+a0f(x) = a_nx^n + a_{n - 1}x^{n - 1} + a_{n - 2}x^{n - 2} + \dots+a_1x + a_0f(x)=an​xn+an−1​xn−1+an−2​xn−2+⋯+a1​x+a0​,我们对它进行一些变形:
f(x)=anxn+an−1xn−1+an−2xn−2+⋯+a1x+a0=(anxn−1+an−1xn−2+⋯+a1)x+a0f(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_0f(x)=an​xn+an−1​xn−1+an−2​xn−2+⋯+a1​x+a0​=(an​xn−1+an−1​xn−2+⋯+a1​)x+a0​

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

f(x)=(…((anx+an−1)x+an−2)⋯+a1)x+a0f(x) = (\dots((a_nx + a_{n - 1})x + a_{n-2})\dots+a_1)x + a_0f(x)=(…((an​x+an−1​)x+an−2​)⋯+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;
}

相关内容

热门资讯

学生借钱应急app微信秒到账2...   如今,网贷日益兴起,网贷平台如同雨后春笋,纷纷涌出。不少学生党也有了借贷的需求。有的时候需要一些...
保险交够年限后可以退回本金吗,...   大家都知道保险是需要每一年到期要缴纳的,相当于给自己的一个保障。有些投保人选择的时间不一样,缴纳...
10万存定期还是买理财 最聪...   前几日有小伙伴问小编他现在手头上有10万元,如果想使利益达到最大化的话应该存定期还是买理财呢?定...
中国人寿大病保险一年多少钱?中... 大家对买保险是怎么看的呢?有没有那么一丝丝的抵触?其实大可不必这样,保险如果是骗人的,那国家肯定出手...
12333激活金融账户,123...   随着国家大力建设基础设施,对大家的生活都进行了完善。社保卡是对每一个公民的一个基础保障,减轻大家...
太平洋百万医疗险缺点有哪些,值...   太平洋保险算是我们中国比较大的保险公司了,大家也都会比较信赖。随着医疗条件的发展还有国民素质的不...
四大银行金条谁家便宜?四大银行...   现如今通货膨胀是非常严重的,很多人都想用钱来投资黄金,黄金在短期内是能赚到收益的,选择走姿金条首...
社保卡金融账户网上激活流程 简...   现在几乎人手一个社保卡,这也意味着大家在享受医保保障的同时,还必须缴纳一定的费用。社会保障卡主要...
房贷放款前借了微粒贷有影响吗?...   现在很多人都想买一个属于自己的房子,买房子不是一个小数目,这时候大家基本上都是会选择贷款买房,现...
逾期记录还清了怎么申请清除,征...   现在社会的每个人压力都很大,经济水平也在不断的上涨,人们的生活压力也随之而来,所以大家多多少少都...