當前位置:首頁 » 編程語言 » 秦九韶演算法c語言

秦九韶演算法c語言

發布時間: 2022-09-08 11:55:21

1. 求用秦九韶演算法求多項式的程序

秦九韶演算法

1.教學任務分析

(1)在學習中國古代數學中的演算法案例的同(2)時,進一步體會演算法的特點。(3)體會中國古代數學對世界數學發展的貢獻。

2. 重點與難點重點:理解秦九韶演算法的思想。難點:用循環結構表示演算法步驟。

3.教學情境設計 (1) 設計求多項式f(x)=2x5-5x4-4x3+3x2-6x+7當x=5時的值的演算法,並寫出程序。

學生提出一般的解決方案,如:

x=5 f=2 * x^5 – 5 * x^4 – 4 * x^3 + 3 * x^2 – 6 * x + 7

PRINT「f=」;fEND

教師點評:上述演算法一共做了解15次乘法運算,5次加法運算,優點是簡單,易懂。缺點是不通用,不能解決任意多項式的求值問題,而且計算效率不高。

(2)有沒有更高效的演算法?

師:計算x的冪時,可以利用前面的計算結果,以減少計算量,即先計算x2,然後依次計算x2.x,(x2.x).x, ((x2.x).x).x的值,這樣計算上述多項式的值,一共需要多少次乘法,多少次加法?

第二種做法與第一種做法相比,乘法的運算次數減少了,因而能提高運算效率,而且對於計算機來說,做一次乘法所需的運算時間比做一次加法要長得多,因此第二種做法更快地得到結果。

(3)能否探索更好的演算法,解決任意多項式的求值問題?

教師引導學生把多項式變形為:f(x)= 2x5-5x4-4x3+3x2-6x+7

=((((2x-5)x-4)x+3)x-6)x+7

並提問:從內到外,如果把每一個括弧都看成一個常數,那麼變形後的式子中有哪些「一次式」?x的系數依次是什麼?

(4)若將x的值代入變形後的式子中,那麼求值的計算過程是怎樣的?

師:計算的過程可以列表表示為:

多項式x系數

2

-5

-4

3

-6

7

運算

10

25

105

540

2670

+

變形後x的"系數"

2

5

21

108

534

2677

*5

最後的系數2677即為所求的值,讓學生描述上述計算過程

師:指出這種演算法就是「秦九韶演算法」,同時介紹秦九韶的生平。

(5)用秦九韶演算法求多項式的值,與多項式的組成有直接關系嗎?用秦九韶演算法計算上述多項式的值,需要多少次乘法運算和多少次加法運算?教師引導學生發現在求值的過程中,計算只與多項式的系數有關,讓學生統計所進行的乘法和加法運算的次數。(6) 秦九韶演算法適用一般的多項式f(x)=anxn+an-1xn-1+….+a1x+a0的求值問題嗎?

師:怎樣用秦九韶演算法求一般多項式f(x)= anxn+an-1xn-1+….+a1x+a0當x=x0時的值?

教師引導學生思考,把n次多項式的求值問題轉化成求n個一次多項式的值的問題,即求v1=anx+an-1

v2=v1x+an-2 v3=v2x+an-3 …….. vn=vn-1x+a0

的值的過程,共做了多少次乘法運算,多少次加法運算?

(7)怎樣用程序框圖表示秦九韶演算法

觀察秦九韶演算法的數學模型,計算vk時要用到vk-1的值,若令v0=an,我們可以得到下面的遞推公式:

v0=an vk=vk-1+an-k(k=1,2,…n)

這是一個在秦九韶演算法中反復執行的步驟,可以用循環結構來實現。

(8)小結:通過對秦九韶演算法的學習,你對演算法本身有哪些進一步的認識?

教師引導學生思考、討論、概括,小結時要關注如下幾點:(1)演算法具有通用的特點,可以解決一類問題;(2)解決同一類問題,可以有不同的演算法,但計算的效率是不同的,應該選擇高效的演算法;(3)演算法的種類雖多,但三種邏輯結構可以有效地表達各種演算法;等等。

(9)課後作業:習題1.3A組第2題。

2. 這個C程序是寫秦九韶演算法的,為什麼結果總是非常大的錯誤值,幫忙看看 #include <stdio

從代碼看出你沒弄明白演算法是怎麼計算的,你在看看,我幫你改了下

#include <stdio.h>

#include <stdlib.h>

void main()

{

int n;

double x , sum=0;

int *p;

int i;

printf("請輸入x的值:");

scanf("%lf",&x);

printf("請輸入參數個數:");

scanf("%d",&n);

p = (int *)malloc(n * sizeof(int));//定義動態數組判斷創建是否成功

if(!p)

{

printf("內存創建失敗。");

exit(0);

}

printf("請輸入常數值:");

for(i=0;i<n;i++)//輸入數組

{

scanf("%d",(p+i));

}

printf("輸入常數為:");

for( i=0;i<n;i++){

printf("%d ",p[i]);

}

for(i=n-1;i>=0;i--)//計算值

{

sum=sum*x+p[i];

}

printf("算式的值為:%lf",sum);


}

運行結果如下:


3. 二進制轉8421BCD碼的演算法

BCD碼使用4位二進制數來表示十進制中0~9這10個數的數碼。例如,十進制的237,其BCD碼就是 0010_0011_0111 ,但是其二進制是 1110_1101 。

我們先來研究兩個4位的BCD碼相加的情況。設這兩個BCD碼對應的十進制是a,b,其中a,b∈{0,1,2,...,9}。此時只有3種情況:

也就是說:

第一種情況顯然不需要再修正。
第二種情況,例如,5+8=13,我們希望得到BCD碼是 0001_0011 ,但是運算結果 1101 ,因此如果我們加上了6,就可以得到正確結果: 1101 + 0110 = 0001_0011 。這是因為,十進制是逢十進一,但是4位BCD加法,在看作是二進制數做加法時,是逢十六進一。因此,如果結果是10≤a+b≤15,加上6以後就是16+0≤a+b+6≤16+5,此時因為逢十六進一的原因,就得到了結果 1_0≤[a+b+6]≤1_5 ,這個結果就是對的。
第三種情況,因為16≤a+b≤18,逢十六進一後,我們得到了 1_0≤[a+b]≤1_2 ,為了使結果正確,如果我們加上一個修正值6,就得到 1_6≤[a+b+6]≤1_8 ,從而結果也變得正確。

綜上所述,如果兩個BCD碼相加:

考慮一個例子,比如 35+99=134。35和99的BCD碼分別是 0011_0101 和 1001_1001 。先計算低4位: 0101 + 1001 = 1110 ,因為這個值大於9,因此加上6作為修正: 1110 + 0110 = 1_0100 。現在計算高四位,同時注意到還有一個進位: 0011 + 1001 + 0001 = 1101 ,這個值還是大於9,加上6,得到 1101 + 0110 = 1_0011 。因此最終結果是 1_0011_0100 ,這剛好就是134的BCD碼。

我們之所以能夠安全地加上進位,是因為BCD加法比照的就是十進制的加法,只不過前者是4位為一個單位,而後者是以1位數字作為一個單位。加上修正值後,BCD加法的進位就相當於十進制加法的進位。圖示如下:

給定一個二進制數,要轉BCD碼。一個常用演算法就是不斷將該數除以10,以此依次分解出個位、十位、百位……上的數字,這些數字的4位二進制數就是對應的BCD。但是這樣的演算法需要不斷做除法操作十分的麻煩。我們可以使用名為 加三左移法 來完成。

這個演算法基於以下的事實:

一個n位二進制數 ,其展開是 如果使用秦九韶演算法的嵌套形式寫法,可以寫成: 或者若令 則 如果使用這種形式,我們先計算的是 ,然後是 ,然後是 ,……,最後是 。

注意到 就是把 左移1位,這樣就會在最右邊空出一個位,之後再加 就是用 填充這個最低位,從而我們得到了 。不斷左移,最終就能得到 ,現在我們來設計一個演算法使得左移結束後能得到對應的BCD碼。

設 是一個無限長的、初始狀態為所有位都是0的理想寄存器, 是欲轉換的數。我們使用下面的 歸納法 來構造證明我們通過不斷左移最終能夠得到存儲在 中的 對應的BCD碼:

由數學歸納原理,移動 len(h) 次後,我們最終可以得到 的BCD碼。

作為一個例子,考慮使用該演算法將 的二進制 1000_0110 轉為BCD碼:

現在, 已經全部移入,此時 的值就是 0001_0011_0100 ,它就是 的BCD碼。

C語言的演算法如下:

4. 編程實現:用秦九韶演算法求多項式p(x)=3x^5-2x^3+x+7在x=3處的值

p(x)=3x^5+0x^4-2x^3+0x^2+x+7
=(3x^4+0x^3-2x^2+0x+1)x+7
=((3x^3+0x^2-2x+0)x+1)x+7
=(((3x^2+0x-2)x+0)x+1)x+7
=((((3x+0)x-2)x+0)x+1)x+7
v[1]=3x+0=9
v[2]=v[1]x-2=25
v[3]=v[2]x+0=75
v[4]=v[3]x+1=226
v[5]=v[4]x+7=685
如果你還有什麼不懂的,可以網路搜下:編程回憶錄,他們現在正在錄制這方面的教程,都是零基礎開始,由淺入深。

5. 用C語言編程實現秦九韶

/*修改n,n代表f(x)為n次多項式*/
#define n 5/*暫且設定為5*/
#include<stdio.h>
void main()
{
float a[n],x,sum;
int i;
printf("Please input the value of x=");
scanf("%f",&x);
for(i=n;i>=0;i--)
{
printf("Please input the value of a%d=",i);
scanf("%f",&a[i]);
}
sum=a[n];
for(i=n;i>=1;i--)
{
sum=sum*x+a[i-1];
}
printf("f(x)=%f\n",sum);
}
/*互相學習哈*/

6. 秦九韶法是典型的什麼演算法

其實我認為想讓你回答的是遞歸演算法。
理解這個演算法的本質後你會這么想。(呵呵我算懂了嗎?)

這個演算法是這樣的,將一個大規模的問題通過一步簡化,化為一個稍小規模的問題,最後解決。你想想是不是這個道理。
這種演算法一般我們叫它遞歸的。只是秦九韶演算法有非遞歸實現。

類似的演算法有快速排序,漢諾塔,歸並排序等等。

7. 秦九韶演算法的C++語言怎麼表示

同學你好,我幫你實現了下!
#include<iostream>
#define N 3
using namespace std;
void main()
{
int a[N]; //N為多項式個數
int x; //x為變數值
int temp; //存儲當前計算的值
for(int i=0;i<N;i++)
{
cout<<"請輸入第"<<i+1<<"個系數"<<endl;
cin>>a[i]; //數組a[i]存放每一項的系數
}
temp=a[N-1];
cout<<"請輸入x的值為"<<endl;
cin>>x;
for(int j=N-1;j>=1;j--)
{
temp=temp*x+a[j-1];//這個是迭代過程求多項式的值
}
cout<<"the result "<<temp<<endl;
}

8. 求C語言的解答

把一個n次多項式f(x) = a(n)×x^n + a(n – 1)x^n – 1 + …… + a(1)x + a(0),分拆成n個一次多項式:v(1) = a(n)x + a(n – 1)、v(2) = v(1)x + a(n – 2)、v(3) = v(2)x + a(n – 3)……v(n) = v(n – 1)x + a(0),這種演算法叫做秦九韶演算法。

float Polynomial(int n, int a[], float x0);
float y=a[n-1];
for(int i=n-1;i>=1;--i){
y=y*x0+a[i-1];
}
return y;
}

熱點內容
自動充值腳本 發布:2025-01-13 07:48:02 瀏覽:19
越容易壓縮 發布:2025-01-13 07:37:37 瀏覽:557
ecstore資料庫 發布:2025-01-13 07:29:43 瀏覽:296
手機設置密碼忘記了怎麼解開 發布:2025-01-13 07:28:29 瀏覽:21
存儲卡交流 發布:2025-01-13 07:16:06 瀏覽:984
php字元串浮點數 發布:2025-01-13 07:15:28 瀏覽:999
python排序cmp 發布:2025-01-13 07:09:04 瀏覽:73
雲腳本精靈 發布:2025-01-13 07:03:27 瀏覽:619
高維訪問 發布:2025-01-13 07:03:23 瀏覽:976
保衛蘿卜有腳本嗎 發布:2025-01-13 06:30:29 瀏覽:743