算法算术
㈠ 算术表达式求值算法
#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年),刘徽给《九章算术》作注,才大大弥补了这个缺陷。
以上内容参考网络-九章算术
㈧ 算术与算法,算术与数学的区别和联系
“算术”是一个学科的名称.“算法”顾名思义是一种计算方法而已.
“数学”是一个大的学科分类,里面包括“高等数学”“初级数学”“代数”几何“”算术“等等、等等.
”算术“只是数学里的一个小的分类.一般是指小学里的课程.
现在,一般笼统地都叫数学:小学数学、中学数学、大学数学.没有多少人再说”算术“了.
其实,我认为这样不好.还是小学叫算术,中学叫代数、几何.,大学冠以”高等“.这样比较好.