演算法算術
㈠ 算術表達式求值演算法
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#define DEBUG
#define NULL 0
#define ERROR -1
#define STACKSIZE 20
/* 定義字元類型棧 */
typedef struct{
char stackname[20];
char *base;
char *top;
} Stack;
/* ----------------- 全局變數--------------- */
Stack OPTR, OPND; /* 定義前個運算符棧,後個操作數棧 */
char expr[255] = ""; /* 存放表達式串 */
char *ptr = expr;
int step = 0; /* 計算的步次 */
int InitStack(Stack *s, char *name)
{
s->base=(char *)malloc(STACKSIZE*sizeof(char));
if(!s->base) exit (ERROR);
strcpy(s->stackname, name);
s->top=s->base;
return 1;
}
int In(char ch)
{
return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#');
}
void OutputStatus(void)
{
char *s;
/* step */
printf("\n%-8d", ++step);
/* OPTR */
for(s = OPTR.base; s < OPTR.top; s++)
printf("%c", *s);
printf("\t");
/* OPND */
for(s = OPND.base; s < OPND.top; s++)
printf("%d ", *s);
/* input char */
printf("\t\t%c", *ptr);
}
int Push(Stack *s,char ch)
{
#ifdef DEBUG
char *name = s->stackname;
OutputStatus();
if(strcmp(name, "OPND") == 0)
printf("\tPUSH(%s, %d)", name, ch);
else
printf("\tPUSH(%s, %c)", name, ch);
#endif
*s->top=ch;
s->top++;
return 0;
}
char Pop(Stack *s)
{
char p;
#ifdef DEBUG
OutputStatus();
printf("\tPOP(%s)", s->stackname);
#endif
s->top--;
p=*s->top;
return (p);
}
char GetTop(Stack s)
{
char p=*(s.top-1);
return (p);
}
/* 判斷運算符優先權,返回優行權高的 */
char Precede(char c1,char c2)
{
int i=0,j=0;
static char array[49]={ '>', '>', '<', '<', '<', '>', '>',
'>', '>', '<', '<', '<', '>', '>',
'>', '>', '>', '>', '<', '>', '>',
'>', '>', '>', '>', '<', '>', '>',
'<', '<', '<', '<', '<', '=', '!',
'>', '>', '>', '>', '!', '>', '>',
'<', '<', '<', '<', '<', '!', '='};
switch(c1)
{
/* i為下面array的橫標 */
case '+' : i=0;break;
case '-' : i=1;break;
case '*' : i=2;break;
case '/' : i=3;break;
case '(' : i=4;break;
case ')' : i=5;break;
case '#' : i=6;break;
}
switch(c2)
{
/* j為下面array的縱標 */
case '+' : j=0;break;
case '-' : j=1;break;
case '*' : j=2;break;
case '/' : j=3;break;
case '(' : j=4;break;
case ')' : j=5;break;
case '#' : j=6;break;
}
return (array[7*i+j]); /* 返回運算符 */
}
/*操作函數 */
int Operate(int a,char op,int b)
{
#ifdef DEBUG
OutputStatus();
printf("\tOPERATE(%d, %c, %d)", a, op, b);
#endif
switch(op)
{
case '+' : return (a+b);
case '-' : return (a-b);
case '*' : return (a*b);
case '/' : return (a/b);
}
return 0;
}
int EvalExpr(void)
{
char c,theta,x,m,ch;
int a,b;
c = *ptr++;
while(c!='#'||GetTop(OPTR)!='#')
if(!In(c))
{
m=atoi(&c);
Push(&OPND,m);
c = *ptr++;
}
else
switch(Precede(GetTop(OPTR),c))
{
case '<':
Push(&OPTR,c);
c = *ptr++;
break;
case '=':
x=Pop(&OPTR);
c = *ptr++;
break;
case '>':
theta=Pop(&OPTR);
b=Pop(&OPND); a=Pop(&OPND);
Push(&OPND,Operate(a,theta,b));
break;
}
return GetTop(OPND);
}
int main(void)
{
/*
printf("Input the expression(end with \"#\" sign):");
do{
gets(expr);
}while(!*expr); */
//strcpy(expr, "2*(2+3)#");
char *pc;
printf("Input the expression(end with \"#\" sign):");
gets(expr);
pc=expr;
if(expr[0]=='\0')
{
printf("Please input a valid expression!\n");
printf("Input the expression again(end with \"#\" sign):");
gets(expr);
}
else
{
while(*pc!='\0')
pc++;
pc--;
if(*pc!='#')
{
printf("Please asure the expression end with \"#\" sign!\n");
printf("Input the expression again(end with \"#\" sign):");
gets(expr);
}
}
InitStack(&OPTR, "OPTR"); /* 初始化運算符棧 */
Push(&OPTR,'#'); /* 將#壓入運算符棧 */
InitStack(&OPND, "OPND"); /* 初始化操作數棧 */
printf("\n\nresult:%d\n", EvalExpr());
system("pause");
return 0;
}
㈡ 算術和演算法的區別
演算法是指完成一個任務准確而完整的描述。也就是說給定初始狀態或輸入數據,經過計算機程序的有限次運算,能夠得出所要求或期望的終止狀態或輸出數據。
「算術」這個詞,在我國古代是全部數學的統稱。至於幾何、代數等許多數學分支學科的名稱,都是後來很晚的時候才有的。
國外系統地整理前人數學知識的書,要算是希臘的歐幾里得的《幾何原本》最早。《幾何原本》全書共十五卷,後兩卷時候人增補的。全書大部分是屬於幾何知識,在第七、八、九卷中專門討論了數的性質和運算,屬於算術的內容。
現在拉丁文的「算術」這個詞是由希臘文的「數和數(音屬,shû三音)數的技術」變化而來的。「算」字在中國的古意也是「數」的意思,表示計算用的竹籌。中國古代的復雜數字計算都要用算籌。所以「算術」包含當時的全部數學知識與計算技能,流傳下來的最古老的《九章算術》以及失傳的許商《算術》和杜忠《算術》,就是討論各種實際的數學問題的求解方法。
㈢ 算術與演算法,算術與數學的區別和聯系
定義數學期望:1)離散型隨機變數的一切可能的取值xi與對應的概率Pi(=xi)之積的和稱為該離散型隨機變數的數學期望[1] (設級數絕對收斂),記為E(x)。數學期望是最基本的數學特徵之一。它反映隨機變數平均取值的大小。又稱期望或均值。如果隨機變數只取得有限個值,稱之為離散型隨機變數的數學期望。它是簡單算術平均的一種推廣,類似加權平均。2)設連續性隨機變數X的概率密度函數為f(x),若積分絕對收斂,則稱積分的值為隨機變數的數學期望,記為E(X)。2.關系算術平均是來自樣本的。是近似的。數學期望是母體的。是精確的。如果在期望值的計算中,如果用古典概率論,每個數據對應的概率是1/N,N是數據個數。那麼期望值就等於算術平均數。
㈣ 快速算數技巧心演算法
下面介紹2種心算方法,這2種心演算法適合計算加減法時用,而且,還不用列豎式,直接通過心算,就能得出答案!即使是數學成績很差的小學生,也能通過這種心算方法,獲得計算成功的快樂,增加學習數學的興趣!
第2種心算方法:
397+98+196=?
如何用心算的方法來做呢?我們先觀察,像這些加數,它有一個特點,就是接近於整百數,比如,397接近於400,98接近於100,196接近於200,那我們就先用400加100再加上200,得出700,然後呢,給結果再減去剛才多加上的3+2+4,即700減9,順利通過心演算法,得出結果為691。
㈤ 中國古代數學中的演算法
★
關於輾轉相除法,
搜了一下,
在我國古代的《九章算術》中就有記載,現摘錄如下:
約分術曰:「可半者半之,不可半者,副置分母、子之數,以少減多,更相減損,求其等也。以等數約之。」
其中所說的「等數」,就是最大公約數。求「等數」的辦法是「更相減損」法,實際上就是輾轉相除法。
輾轉相除法求最大公約數,是一種比較好的方法,比較快。
對於52317和75569兩個數,你能迅速地求出它們的最大公約數嗎?一般來說你會找一找公共的使因子,這題可麻煩了,不好找,質因子大。
現在教你用輾轉相除法來求最大公約數。
先用較大的75569除以52317,得商1,余數23252,再以52317除以23252,得商2,余數是5813,再用23252做被除數,5813做除數,正好除盡得商數4。這樣5813就是75569和52317的最大公約數。你要是用分解使因數的辦法,肯定找不到。
那麼,這輾轉相除法為什麼能得到最大公約數呢?下面我就給大夥談談。
比如說有要求a、b兩個整數的最大公約數,a>b,那麼我們先用a除以b,得到商8,余數r1:a÷b=q1…r1我們當然也可以把上面這個式子改寫成乘法式:a=bq1+r1------l)
如果r1=0,那麼b就是a、b的最大公約數3。要是r1≠0,就繼續除,用b除以r1,我們也可以有和上面一樣的式子:
b=r1q2+r2-------2)
如果余數r2=0,那麼r1就是所求的最大公約數3。為什麼呢?因為如果2)式變成了b=r1q2,那麼b1r1的公約數就一定是a1b的公約數。這是因為一個數能同時除盡b和r1,那麼由l)式,就一定能整除a,從而也是a1b的公約數。
反過來,如果一個數d,能同時整除a1b,那麼由1)式,也一定能整除r1,從而也有d是b1r1的公約數。
這樣,a和b的公約數與b和r1的公約數完全一樣,那麼這兩對的最大公約數也一定相同。那b1r1的最大公約數,在r1=0時,不就是r1嗎?所以a和b的最大公約數也是r1了。
有人會說,那r2不等於0怎麼辦?那當然是繼續往下做,用r1除以r2,……直到余數為零為止。
在這種方法里,先做除數的,後一步就成了被除數,這就是輾轉相除法名字的來歷吧。
㈥ 數學的各種演算法
演算法(Algorithm)是指解題方案的准確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間復雜度與時間復雜度來衡量。
演算法中的指令描述的是一個計算,當其運行時能從一個初始狀態和(可能為空的)初始輸入開始,經過一系列有限而清晰定義的狀態,最終產生輸出並停止於一個終態。一個狀態到另一個狀態的轉移不一定是確定的。隨機化演算法在內的一些演算法,包含了一些隨機輸入。
形式化演算法的概念部分源自嘗試解決希爾伯特提出的判定問題,並在其後嘗試定義有效計算性或者有效方法中成形。這些嘗試包括庫爾特·哥德爾、Jacques Herbrand和斯蒂芬·科爾·克萊尼分別於1930年、1934年和1935年提出的遞歸函數,阿隆佐·邱奇於1936年提出的λ演算,1936年Emil Leon Post的Formulation 1和艾倫·圖靈1937年提出的圖靈機。即使在當前,依然常有直覺想法難以定義為形式化演算法的情況。
一個演算法應該具有以下五個重要的特徵:
有窮性
(Finiteness)
演算法的有窮性是指演算法必須能在執行有限個步驟之後終止;
確切性
(Definiteness)
演算法的每一步驟必須有確切的定義;
輸入項
(Input)
一個演算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指演算法本身定出了初始條件;
輸出項
(Output)
一個演算法有一個或多個輸出,以反映對輸入數據加工後的結果。沒有輸出的演算法是毫無意義的;
可行性
(Effectiveness)
演算法中執行的任何計算步驟都是可以被分解為基本的可執行的操作步,即每個計算步都可以在有限時間內完成(也稱之為有效性)。
一、數據對象的運算和操作:計算機可以執行的基本操作是以指令的形式描述的。一個計算機系統能執行的所有指令的集合,成為該計算機系統的指令系統。一個計算機的基本運算和操作有如下四類:[1]
1.算術運算:加減乘除等運算
2.邏輯運算:或、且、非等運算
3.關系運算:大於、小於、等於、不等於等運算
4.數據傳輸:輸入、輸出、賦值等運算[1]
二、演算法的控制結構:一個演算法的功能結構不僅取決於所選用的操作,而且還與各操作之間的執行順序有關。
演算法可大致分為基本演算法、數據結構的演算法、數論與代數演算法、計算幾何的演算法、圖論的演算法、動態規劃以及數值分析、加密演算法、排序演算法、檢索演算法、隨機化演算法、並行演算法,厄米變形模型,隨機森林演算法。
演算法可以宏泛地分為三類:
一、有限的,確定性演算法 這類演算法在有限的一段時間內終止。他們可能要花很長時間來執行指定的任務,但仍將在一定的時間內終止。這類演算法得出的結果常取決於輸入值。
二、有限的,非確定演算法 這類演算法在有限的時間內終止。然而,對於一個(或一些)給定的數值,演算法的結果並不是唯一的或確定的。
三、無限的演算法 是那些由於沒有定義終止定義條件,或定義的條件無法由輸入的數據滿足而不終止運行的演算法。通常,無限演算法的產生是由於未能確定的定義終止條件。
希望我能幫助你解疑釋惑。
㈦ 九章演算法是什麼
九章演算法是指《九章算術》,《九章算術》是中國古代張蒼、耿壽昌所撰寫的一部數學專著。是《算經十書》中最重要的一部,成於公元一世紀左右。其作者已不可考。
一般認為它是經歷代各家的增補修訂,而逐漸成為現今定本的,西漢的張蒼、耿壽昌曾經做過增補和整理,其時大體已成定本。最後成書最遲在東漢前期,現今流傳的大多是在三國時期魏元帝景元四年(263年),劉徽為《九章》所作的注本。
《九章算術》主要特點
《九章算術》確定了中國古代數學的框架,以計算為中心的特點,密切聯系實際,以解決人們生產、生活中的數學問題為目的的風格。其影響之深,以致以後中國數學著作大體採取兩種形式:或為之作注,或仿其體例著書。
甚至西算傳入中國之後,人們著書立說時還常常把包括西算在內的數學知識納入九章的框架。 然而,《九章算術》亦有其不容忽視的缺點:沒有任何數學概念的定義,也沒有給出任何推導和證明。魏景元四年(263年),劉徽給《九章算術》作注,才大大彌補了這個缺陷。
以上內容參考網路-九章算術
㈧ 算術與演算法,算術與數學的區別和聯系
「算術」是一個學科的名稱.「演算法」顧名思義是一種計算方法而已.
「數學」是一個大的學科分類,裡麵包括「高等數學」「初級數學」「代數」幾何「」算術「等等、等等.
」算術「只是數學里的一個小的分類.一般是指小學里的課程.
現在,一般籠統地都叫數學:小學數學、中學數學、大學數學.沒有多少人再說」算術「了.
其實,我認為這樣不好.還是小學叫算術,中學叫代數、幾何.,大學冠以」高等「.這樣比較好.