码迷,mamicode.com
首页 > 其他好文 > 详细

霍纳法则(Horner's rule)

时间:2014-04-29 13:37:21      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:霍纳法则

卡在hdu 1402 的高精度乘法了,要用FFT(快速傅里叶变换),然后看到了这个霍纳法则,顺便就写下来了。

霍纳法则:求多项式值的一个快速算法。

简单介绍:

假设有n+2个数 , a0,a1,a2,a3,……an 和x组成的一个多项式,形式如下:

  a0*x^0+a1*x^1+a2*x^2+a3*x^3+……an*x^n   ,通常都是一项一项的求和然后累加,这样的话要进行n* (n+1)/2 次乘法运算 和 n 次加法运算 ,

而霍纳法则就是一个改进的一个算法。通过变换得到如下式子:

(((……(((an+an-1)*x+an-2)*x+an-3)*x)+……)*x+a1)*x+a0 ,

这种求值的方法便是霍纳法则。(复杂度 为 O(n) )

根据霍纳法则写的一个代码:

简单的多项式求值

#include <iostream>

using namespace std;

int Horner_rule(int arr[],int n,int x)
{
    int i,ans = 0;;
    for(i = 0;i<n;i++)
    {
        ans =arr[i]+x*ans;
    }
    return ans;
}
int main()
{
    int n,x,i,t,arr[1000];
    cin>>t;
    while(t--)
    {
        cout<<"输入 : n , x : ";
        cin>>n>>x;
        cout<<"输入 "<<n <<" 个数  : ";
        for(i = n-1;i>=0;i--)//求值是从 an 开始,所以倒着存
            cin>>arr[i];
        for(i = 0;i<n-1;i++)
            cout<<arr[i]<<"*x"<<"^"<<i<<"+";
        cout<<arr[i]<<"*x"<<"^"<<i<<" = ";
        cout<<Horner_rule(arr,n,x)<<endl;
    }
    return 0;
}




霍纳法则(Horner's rule)

标签:霍纳法则

原文地址:http://blog.csdn.net/gray_1566/article/details/24697937

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!