① 設計要求 (1)先用C語言描述正確的計算最大公約數的演算法 ,保證演算法的正確性 (2)然後設計一個該演算法的
歐幾里德演算法又稱輾轉相除法,用於計算兩個正整數a,b的最大公約數。其計算原理依賴於下面的定理:
定理:gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不為0)
證明:a可以表示成a = kb + r,則r = a mod b
假設d是a,b的一個公約數,則有
d|a, d|b,而r = a - kb,因此d|r
因此d也是(b,a mod b)的公約數
因此(a,b)和(b,a mod b)的公約數是一樣的,其最大公約數也必然相等,得證。
輾轉相除法是利用以下性質來確定兩個正整數 a 和 b 的最大公因子的:
1. 若 r 是 a ÷ b 的余數, 則
gcd(a,b) = gcd(b,r)
2. a 和其倍數之最大公因子為 a。
另一種寫法是:
1. 令r為a/b所得余數(0≤r<b)
若 b= 0,演算法結束;a 即為答案。
2. 互換:置 a←b,b←r,並返回第一步。
歐幾里德演算法的C語言版
/*歐幾里德演算法:輾轉求余
原理: gcd(a,b)=gcd(b,a mod b)
當b為0時,兩數的最大公約數即為a
getchar()會接受前一個scanf的回車符
*/
#include<stdio.h>
unsigned int Gcd( unsigned int M, unsigned int N )
{
unsigned int Rem;
while( N > 0 )
{
Rem = M % N;
M = N;
N = Rem;
}
return M;
}
void main()
{
int temp;
int a,b;
scanf("%d",&a);
scanf("%d",&b);
printf("the greatest common factor of %d and %d is ",a,b);
printf("%d\n",Gcd(a,b));
}
② 在計算數學中,您認為如何讓學生既理算理,又掌握演算法,還能提高計算的准確性
針對上述原因,我從多方面學習借鑒,再結合自己的教學實踐談談在計算教學中對如何正確處理演算法與算理的關系,努力提高課堂教學時效的看法。
一、加強理論學習,提高自身理論素養。
教師在平常的工作中不斷加強理論學習,尤其要正確解讀新課標,科學的把握新教材,理念先到位,對算理與演算法的怎樣算、為什麼這樣算理解清楚,做到算理演算法互相滲透,合理安排教學時間,提高教學時效。
二、精心設計,正確處理演算法與算理的關系
由於第一年教學計算時沒有經驗,雖然教學設計中注意到了演算法與算理並重,可學生說算理時說不起來,教師只有慢慢引導,直至學生能說清楚算理,可待到學生說清算理後,還沒來得及練習演算法,下課鈴響了,一堂課的教學任務沒能完成。第二年再教時,我就重點注意了演算法與算理的正確處理。
1、算理應是學生在自主探索中建構
在計算碰到新問題時總有相當多的學生會應用已有的經驗想辦法解決問題,教師應為學生提供探索的空間,交流的平台,在交流中明白一個個算理,從而發展學生的思考能力,不但能提升認識,還能為新知的學習打下基礎,縮短教學的時間。
2、展現多種算理時要找到突破點。
葉瀾教授說過,沒有聚焦的發散是沒有價值的,聚焦的目的是為了發展。為此,在交流多種想法時,教師要善於抓住恰當的一種切入口,大部分學生容易理解的進行突破。這樣效率就提高了。
例如:教學十幾減9時,學生出現了好多種演算法,如果要一一解釋每個學生的算理確實要花好長時間,而且其他學生還會有一種雲里霧里的感覺,結果什麼都不清楚,因為每種計算都會有一般的演算法,為後續學習打基礎的。這時教師只有選擇其中最容易理解的破十法和想加算減這兩種方法講解,讓學生理解算理。這樣既能讓所有學生都能理解又提高了教學效率。
3、注重算理與演算法的溝通。
算理是演算法的基礎,當學生明白了算理後,教師及時落實演算法與算理的聯系,有利於對演算法的掌握。
4、基本演算法需要重點強化練習。
一節課有教學目標及教學重點,在多種演算法中有基本演算法,這種基本演算法對後續學習又有很大的影響。所以對基本的演算法有必要進行強化,努力使每一個學生都會。針對上述十幾減9的例子,破十法和想加算減的方法就是基本演算法,進行強化訓練,對後面的十幾減8、7、6、……都有很大的作用。
三、課堂上保證新演算法的練習時間和練習量
在新的計算方法教學的第一課時留有一定的時間完成一定的練習量,能從學生的反饋中了解學生的學習情況,對學生在計算方法上出現的錯誤及時糾正,這樣就能將學生的錯誤消滅在萌芽狀態。對掌握演算法,初步形成計算技能還是十分必要的。
例如:在教學兩位數加減兩位數筆算時。本課的難點是一位數加兩位數的豎式寫法,雖然學生已經通過擺小棒、在計數器上撥算珠知道了列豎式要注意相同數位對齊的算理,但是否完全理解呢?通過集體討論明白算理後,及時組織學生進行練習。首先指名板演,請兩個中下生上黑板做,其餘一起看。這時兩人的計算過程一覽無余,一人正確,另一人卻將一位數與兩位數的十位對齊了,顯然沒有理解相同數位對齊的意思,算理不清楚。經全班同學的點評,這位學生明白了自己的錯誤。在後來的課堂作業中就沒有發生類似的錯誤。如果單靠講算理,而沒有及時練習鞏固,這個錯誤就會延續到第二課,而到了第二課難道還要再演示、再講一遍?課堂的效益從何而來?
四、改變計算教學的模式,給予理解算理的空間。
計算教學常常藉助一定的情境作為一節課的引入,通過情境讓學生提出數學問題,列出算式,探索出結果。情景的創設,能撥動學生思維之弦,激活求知慾,喚起好奇心,使看似枯燥、抽象的數學知識充滿親和力和吸引力。而計算教學一定要藉助情境嗎?沒有情境,學生能夠自己尋找到解決問題的方法嗎?
總之,計算教學中理解算理與掌握演算法不可偏頗,「重算理、輕演算法」和「重演算法、輕算理」都不可取。正確地處理好他們之間的關系,才能有效的提高課堂教學效率。
③ 什麼是結構化程序設計方法
c語言中"結構化程序設計方法」的基本思想和規則C語言是一種結構化語言。它層次清晰,便於按模塊化方式組織程序,易於調試和維護。C語言的表現能力和處理能力極強。它不僅具有豐富的運算符和數據類型,便於實現各類復雜的數據結構。它還可以直接訪問內存的物理地址,進行位(bit)一級的操作。由於C語言實現了對硬體的編程操作,因此C語言集高級語言和低級語言的功能於一體。既可用於系統軟體的開發,也適合於應用軟體的開發。此外,C語言還具有效率高,可移植性強等特點。因此廣泛地移植到了各類各型計算機上,從而形成了多種版本的C語言。
C源程序的結構特點
1.一個C語言源程序可以由一個或多個源文件組成。
2.每個源文件可由一個或多個函數組成。
3.一個源程序不論由多少個文件組成,都有一個且只能有一個main函數,即主函數。
4.源程序中可以有預處理命令(include 命令僅為其中的一種),預處理命令通常應放在源文件或源程序的最前面。
5.每一個說明,每一個語句都必須以分號結尾。但預處理命令,函數頭和花括弧「}」之後不能加分號。
6.標識符,關鍵字之間必須至少加一個空格以示間隔。若已有明顯的間隔符,也可不再加空格來間隔。
書寫程序時應遵循的規則
從書寫清晰,便於閱讀,理解,維護的角度出發,在書寫程序時 應遵循以下規則:
1.一個說明或一個語句佔一行。
2.用{} 括起來的部分,通常表示了程序的某一層次結構。{}一般與該結構語句的第一個字母對齊,並單獨佔一行。
3.低一層次的語句或說明可比高一層次的語句或說明縮進若干格後書寫。以便看起來更加清晰,增加程序的可讀性。在編程時應力求遵循這些規則,以養成良好的編程風格。
④ 設計演算法找出三個數中的最大值
有a,b,c三個數,比較它們的大小
方法一,按順序兩兩比較,取較大的
if (a > b) {
max = a;
} else {
max = b;
}
if (max < c) {
max = c;
}
方法二,假設第一個是最大的,與後面兩個數進行比較,將較大的值賦給max
int max = a;
if (b > max) {
max = b;
}
if (c > max) {
max = c;
}
1、什麼是演算法
演算法(algorithm):就是定義良好的計算過程,他取一個或一組的值為輸入,並產生出一個或一組值作為輸出。簡單來說演算法就是一系列的計算步驟,用來將輸入數據轉化成輸出結果。
mark:我們可以把所有的演算法想像為一本「菜譜」,特定的演算法比如菜譜中的的一道「老醋花生米」的製作流程,只要按照菜譜的要求製作老醋花生米,那麼誰都可以做出一道好吃的老醋花生米。so,這個做菜的步驟就可以理解為:「解決問題的步驟」
2、演算法的意義
假設計算機無限快,並且計算機存儲容器是免費的,我們還需要各種亂七八糟的演算法嗎?如果計算機無限快,那麼對於某一個問題來說,任何一個都可以解決他的正確方法都可以的!
當然,計算機可以做到很快,但是不能做到無限快,存儲也可以很便宜但是不能做到免費。
那麼問題就來了效率:解決同一個問題的各種不同演算法的效率常常相差非常大,這種效率上的差距的影響往往比硬體和軟體方面的差距還要大。
3、如何選擇演算法
第一首先要保證演算法的正確性
一個演算法對其每一個輸入的實例,都能輸出正確的結果並停止,則稱它是正確的,我們說一個正確的演算法解決了給定的計算問題。不正確的演算法對於某些輸入來說,可能根本不會停止,或者停止時給出的不是預期的結果。然而,與人們對不正確演算法的看法想反,如果這些演算法的錯誤率可以得到控制的話,它們有時候也是有用的。但是一般而言,我們還是僅關注正確的演算法!
第二分析演算法的時間復雜度
演算法的時間復雜度反映了程序執行時間隨輸入規模增長而增長的量級,在很大程度上能很好反映出演算法的好壞。
⑤ 演算法的正確性如何檢驗
我這學期也正在學數據結構,學的那個暈那,寫的只是代碼而已,也就是說是編程的思路。如果你要證明,那就得用具體的程序帶入吧。我師傅說,數據結構是編程的重心,最重要了。所以好好學吧。
⑥ 如何才能設計出優秀的演算法
數據結構中評價一個好的演算法,應該從四個方面來考慮,分別是:
一、演算法的正確性。
二、演算法的易讀性。
三、是演算法的健壯性。
四、是演算法的時空效率(運行)。
演算法的設計取決於數據(邏輯)結構,演算法的實現取決於所採用的存儲結構。數據的存儲結構本質上是其邏輯結構在計算機存儲器中的實現。為了充分反映數據的邏輯結構,它在內存中的映像包括兩個方面,即數據元素之間的信息和數據元素之間的關系。不同的數據結構有相應的操作。數據操作是定義在數據邏輯結構上的操作演算法,如檢索、插入、刪除、更新和排序。
(6)保證演算法的正確性的方法擴展閱讀
該演算法的一般性質包括:
1、對於任何符合輸入類型的輸入數據,都可以根據演算法來解決問題,軟體包保證了計算結構的正確性。
2、演算法中的每一條指令都必須能夠被人或機器執行。
3、確定性演算法應該在每一步之後都有明確的下一步指示。也就是說,確保每個步驟都有下一步行動的指示,並且不缺乏或只有模糊的下一步行動指示。
4、有限演算法的執行必須以有限的步數結束。
⑦ 在演算法實現中,演算法的正確性如何保證
演算法本身的正確性用邏輯推理來證明,和數學定理類似
實現演算法的程序的正確性則是兩碼事
簡單的程序也用邏輯推理來證明,稍復雜的可以用某些專門驗證程序正確性的程序來驗證,再復雜的就沒什麼好辦法了,事實上很多復雜的程序在比較極端的輸入下或多或少都會有點問題
⑧ 數據結構中評價一個好的演算法,應該從哪幾個方面來考慮
數據結構中評價一個好的演算法,應該從四個個方面來考慮,分別是:
一、演算法的正確性。
二、演算法的易讀性。
三、是演算法的健壯性。
四、是演算法的時空效率(運行)。
演算法的設計取決於數據(邏輯)結構,而演算法的實現依賴於採用的存儲結構。數據的存儲結構實質上是它的邏輯結構在計算機存儲器中的實現,為了全面的反映一個數據的邏輯結構,它在存儲器中的映象包括兩方面內容,即數據元素之間的信息和數據元素之間的關系。
不同數據結構有其相應的若干運算。數據的運算是在數據的邏輯結構上定義的操作演算法,如檢索、插入、刪除、更新和排序等。
(8)保證演算法的正確性的方法擴展閱讀:
分類
1、集合結構。該結構的數據元素間的關系是「屬於同一個集合」。
2、線性結構。該結構的數據元素之間存在著一對一的關系。
3、樹型結構。該結構的數據元素之間存在著一對多的關系。
4、圖形結構。該結構的數據元素之間存在著多對多的關系,也稱網狀結構。
⑨ 在結構化程序設計方法中,三種基本結構是
1、順序結構:按照它們出現的先後順序執行的。
2、選擇結構:需要根據某一特定的條件選擇其中的一個分支執行。選擇結構有單選擇、雙選擇和多選擇三種形式。
3、循環結構:循環結構表示程序反復執行某個或某些操作,直到某條件為假(或為真)時才可終止循環。
由順序、選擇和循環三種基本程序結構通過組合、嵌套構成,那麼這個新構造的程序一定是一個單入口單出口的程序。據此就很容易編寫出結構良好、易於調試的程序來。
結構化程序設計方法的主要原則可以概括為自頂向下、逐步求精、模塊化及限制使用goto語句,總的來說可使程序結構良好、易讀、易理解、易維護。
(9)保證演算法的正確性的方法擴展閱讀:
按照結構化程序設計的觀點,任何演算法功能都可以通過由程序模塊組成的三種基本程序結構的組合:順序結構、選擇結構和循環結構來實現。
"單入口單出口"的思想認為一個復雜的程序,如果它僅是由順序、選擇和循環三種基本程序結構通過組合、嵌套構成,那麼這個新構造的程序一定是一個單入口單出口的程序。據此就很容易編寫出結構良好、易於調試的程序來。
⑩ 如何提高演算法
計算的准確性不但在「應試教育」中佔主要地位,在「素質教育」的今天同樣重要。因為式子題的計算是學生解決實際問題的基礎,是每個小學生必須掌握的數學基礎知識和基本技能。只有計算過硬,才能進一步學好應用題和其他學科知識。式子題計算是各年級的重要內容,根據學生的考試和作業看,造成成績不理想的原因是計算能力差,准確率不高。造成這種現象的原因是多方面的:首先是低年級忽略了口算訓練,其次是在各年級中輕視了式子題的教學,誤認為計算式子題只要弄清計算順序,便能算出來,這種想法造成學生計算不細心,准確率低,從而缺乏攻克復雜式子題的興趣和信心。
計算準確,要從低年級抓起,不僅要教學生演算法,更要重視口算的訓練。口算是筆算、估算的基礎,只有讓學生在理解的基礎上掌握了口算的方法,堅持練習,逐步達到熟練的程度,才會在中、高年級中熟練、准確地計算。同樣,中高年級也不能忽視口算的練習。
式子題的訓練,還要從讀題做起,讀題要求學生正確規范,這樣有助於弄清運算順序。有括弧題,如(a+b)c,可讀作a與b的和乘以c,不能把括弧讀出來,嚴格要求學生讀准,從中悟出運算順序,確定自己的演算法。弄清計算順序是計算的前期。不這樣訓練,學生容易忽略和弄錯順序,對「准確」沒有把握,長期這樣,學生會對數學失去信心,失去積極性,教師也會對學生的計算失去信心。
文字題是式子題的讀題與列式計算的訓練,在讀題的基礎上,讓學生列出算式,正反結合訓練,會對學生的計算進行強化。文字題既然是計算題的敘述,那麼解決文字題就是列出綜合算式,它與應用題的解答有別,不能用分步計算,但可以用分步式分析。分析後列出綜合計算是解決文字題的正確做法。
加強運算定律和運算性質的教學,多用於實際計算,讓學生充分理解算理,掌握法則,鼓勵學生運用簡便演算法。除題目要求簡算外,教師要有意識地要求學生能簡算的奧運用簡算,提高學生的簡算興趣,使簡算貫穿於一切計算之中,逐步摸索計算的技巧,做到計算合理,靈活,准確,迅速,有力的提高學生的計算能力。
計算準確性的訓練要常抓不懈,養成檢查、驗算的習慣。對於一般的學生,式子題做完了不願意檢查、驗算,造成准確率低的現象。針對這種現象,要有意識的訓練,培養學生驗算,長此以往,「准確」就有保證了。
在式子題的計算中,採用適當的計算方法也要給與指導和練習。如高年級的分數、小數、百分數的混合運算,要根據題和自己的特長確定具體演算法。讓學生針對題型動腦思考,自做練習,在和他人比較,找到巧妙的演算法,也是准確性的訓練。
對學生經過長期多方面的計算訓練,培養學生嚴格、認真、對計算結果負責的良好習慣以及有毅力、肯動腦、克服困難的意志,學生的計算能力就會明顯提高,為下一步學習打下堅實基礎