单片机常用的C语言算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法的描述:
是对要解决一个问题或要完成一项任务所釆取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。
一、计数、求和、求阶乘等简单算法
此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注壷用来表示讣数、和、阶乘的变量的初值。
例:用随机函数产生W0个[0, 99]范ffl内的随机整数,统计个位上的数字分别为1, 2, 3, 4, 5, 6, 7. 8, 9, 0的数的个数并打印出来。
本题使用数组来处理,用数组a[100]存放产生的确100个随机整数,数组
x[10]来存放个位上的数字分别为i, 2, 3, 4, 5, 6, 7, 8, 9, 0的数的个数。即个位是1的个数存放在x[l]中,个位是2的个数存放在刈2] 中,……个位是0的个数存放在数组x[10]o
void m3in(){int a[101],x[ll]jL,p;for(i=0ji<=ll;i++)x=0;for(i=l;i<=1005i-h+){a= rand() % 100jprirrtfC%4cr2);if(i%10H0)p"ntf(");}for(i“]iyl00;“+){p』・r
(p==0)p=*" 10**jx[p]=x[p]-Hlj}fop(i=lji<=10ji+-i-){p=''i''jif(i==10) p=''0*'jprl ntf("S£d,%d\p,x);}ppintf(-);}
二、求两个整数的最大公约数、最小公倍数
分析:求最大公约数的算法思想:(最小公倍数二两个整数之积/最大公约数)
(1)对于已知两数m, n.使得m>n:
⑵m除以n得余数r;
(3)若r=0,则》为求得的最大公约数,算法结束;否则执行(4);
(4)m*—n, n*—r,再重复执行(2)。
例如:求m二”14” ,n=6的最大公约数.
m n r
1462
62 0
void mdin()( int n«i, p,t;printf("please input two numbers: ") jscanf C'%d,%d*' ;nin=n*m;if (m 三.判断素数 1、只能被1或本身整除的数称为素数基本思想:把m作为被除数,将2— INT ()作为除数,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现) void main(){ int iHj i,kjprintff ^'please input a number: *') j scanf ("%d" j&m)5k=sqrt (r»);fop(i=2;i =sqrt(n);for(i=2;i 四、验证哥德巴赫猜想 (任总一个大于等于6的偶数都可以分解为两个素数之和) 基本思想:n为大于等于6的任一偶数,可分解为nl和n2两个数,分别检查nl和 n2是否为素数,如都是,则为一组解。如nl不是素数,就不必再检査n2是否素数。先从nl=3开始,检验nl和n2 (n2=N-nl)是否素数。然后使nl+2再检验nl、n2是否素数,…直到nl=n/2为止。 利用上面的prime函数,验证哥德巴赫猜想的程序代码如下: #include "math.h*'irt prime(int int i,k;k=sqrt(ni);for(i=2;i 0) break;if(i>-k)return l;el$ereturn 0;}niain(){ int x,i;printf("please input 3 even number(>=6): ") ;scanf ,&x);if (x<6| | x%2 !=0)printf ("data error !*') ;e lsefor{i=2;i<=x/2;i卄)if (p「imQ(i)&&primQ(x・i)){printe(丿x・i);p户intf(••验证成功! “);break;}} 五、排序问题 1.选择法排序(升序) 基本思想: 1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第I个数交换位置; 2)除第I个数外,其余nJ个数中选最小的数,与第2个数交换位置; 3)依次类推,选择了nJ次后,这个数列已按升序排列。 程序代码如下: void msinO'J int i,j,imin,s,a[10];printf("' i叩ut 10 numbers:'');for(i=0;i< 10;i ++)scanf {"%d'',&a);for(i=0;i<9;i++){ imin="i'';for(j=ifl;j<10j j++)Lf(a[iniin]>3 [j]) {i!=iinin){s=a; a=a[iniLn]j a[iinin]=s; }printf("炒,a);}} 2. 0泡法排序(升序) 基本思想:(将相邻两个数比较,小的调到前头) 1)有n个数(存放在数组4(n)中),第一趟将每相邻两个数比较,小的调到前头,经次两两相邻比较后,最大的数已“沉底S放在最后一个位置, 小数上升“浮起J 2)第-•趟对余下的个数(最大的数己“沉底T按上法比较,经n・2次两两相邻比较后得次大的数; 3)依次类推,》个数共进行趟比较,在第j趟中要进行n・j次两两比较。程序段如下: void main(){ int a[10];int i,j,t;ppintf(^'input 10 numbers");for{i=0ji<10;i-i-+) 5canf(''%d"jSa) jprintf {*"');for( j=0; j<=8; j++)for(i=0;L<9-(3>a[L+l]){t= a;a=a[i+l]ja[i+l]=t;}printf("the sorted numbers;jfop(i=0;L< 10;i++)printf(''% dj);} 3.合并法排序(将两个有序数组A、B合并成另一个有序的数组C,升序)基本思想: 1)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组: 2)取小的元素所在数组的下一个元素与歼一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完; 3)将另一个数组剩余元素抄入C数组,合并排序完成。