ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:23.52KB ,
资源ID:11962878      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11962878.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言常用算法程序汇总.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C语言常用算法程序汇总.docx

1、C语言常用算法程序汇总C 程序设计的常用算法算法( Algorithm ):计算机解题的基本思想方法和步骤。 算法的描述:是对要解决一个问题或要完成一项任务所采取的 方法和步骤的描述,包括需要什么数据(输入什么数据、输出 什么结果)、采用什么结构、使用什么语句以及如何安排这些 语句等。通常使用自然语言、结构化流程图、伪代码等来描述 算法。一、简单数值类算法此类问题都要使用循环, 要注意根据问题确定循环变量的 初值、终值或结束条件,更要注意用来表示计数、和、阶乘的 变量的初值。1、 求阶乘:n!=1*2*384 .*n; n!= n*(n-1)!=下列程序用于求 n 的阶乘.在累乘之前 ,一定要

2、将用于存放乘 积的变量的值初始化为 1.long func(int n)int i;long t=1;for(i=2;i=n;i+) t*=i;return t;printf(n);main() int n;scanf(%d, &n);printf(n!=%ldn, fac(n);2、整数拆分问题:把一个整数各个位上的数字存到数组中 #define N 4 /* N 代表整数位数 */ viod split(int n, int a )/* 1478: a 3=8, a2 =7, a1 =4 */int i;for(i=N-1;i!=0; i-) ai=n%10;n=n/10;main()in

3、t i,m=1478,bN-1; split(m, b) ; for(i=0;i4; i+) printf( “%5d”, bi); 3、求整数的因子之和 12=1*2*3*4 long factor(int n)int i;long sum=0;for(i=1;in;(2)m 除以 n 得余数 r; r=m%n;(3)若r= =0,则n为求得的最大公约数,算法结束;否则 执行 (4);(4)mn, nr,再重复执行(2)。例如: 求 m=14 ,n=6 的最大公约数 . m n r14 %6= 26 %2= 0 输出 2void main() int nm,r,n,m,t;printf(pl

4、ease input two numbers:n);scanf(%d,%d,&m,&n);nm=n*m;if (mn) t=n; n=m; m=t; r=m%n;while (r!=0) m=n; n=r; r=m%n; printf( 最大公约数 :%dn,n);printf( 最小公倍数 :%dn, nm/n);将其写成一函数 ,返回最大公约数。int gcd(int m,int n) int t,r;if(mn) t=m;m=n;n=t; r=m%n;while(r!=0) m=n; n=r; r=m%n; return n;int gcd(int m,int n) int t,r;if

5、(mn) t=m;m=n;n=t; do r=m%n;m=n; n=r; while(n!=0)return m; 如果求最小公倍数,其函数形式稍作调整: int gcd(int m,int n) int a=m, b=n;int t,r;if(mn) t=m;m=n;n=t; r=m%n;while(r!=0) m=n; n=r; r=m%n; return (a*b)/n;三、判断素数只能被 1 和本身整除的正整数称为素数。基本思想:在判断数 m 是否为素数时,首先把 m 作为被 除数,将2 sqrt(m)的所有数字依次作为除数,去除 m,只要有一个数能将 m 整除,则 m 不是素数;否则

6、,如果都除不尽, 则 m 就是素数。(可用以下程序段实现)#include void main() int m,i,k;printf(please input a number:n);scanf(%d,&m);k=sqrt(m); /* 使用此函数一定要加头文件#include */for(i=2;i=k)printf( 该数是素数 );elseprintf( 该数不是素数 );将其写成一函数 ,若为素数返回 1,不是则返回 0int prime( int m)int i,k;k=sqrt(m); /*使用此函数一定要加头文件#inelude*/for(i=2;ik;i+)if(m%i=O)

7、return 0;return 1;四、求最值例如求最小值算法思想:定义变量min用于存放当前所有找到的最小数,a为已知 数组。算法步骤如下:1)在min中存放第1个数,比较从数组中的第二个元素 开始。2) 数组a中每个元素依次与 min中的数组相比,小者放 入min中。3) 比较完数组的最后一个元素,算法结束。Min中数为 所求。求最大值:max=a0;for(i=0;i max) max=ai;程序如下:int min value(i nt a,i nt n)int i,min;min=a0;for(i=1;i n ;i+)if(aimi n) mi n=ai;return min;mai

8、n() int a10=12,45,7,8,96,4,10,48,2,46,i,min; for(i=0;i10;i+)printf( “%3d”,ai);printf( “n”); min=minvalue(a,10);printf( “the result is:%d”, min);五、排序问题1 选择法排序(升序) 基本思想:1) 对有n个数的序列(存放在数组a(n)中),从中选出最 小的数,与第1个数交换位置;2) 除第1个数外,其余n-1个数中选最小的数,与第2 个数交换位置;程序代码如下:void mai n() int i,j,imi n,s,a10;printf(n in pu

9、t 10 numbers:n); for(i=0;i10;i+)sca nf(%d, &ai); for(i=0;i9;i+) imi n=i;for(j=i+1;jaj) imi n=j;if(i!=imi n)s=ai; ai=aimi n; aimi n=s; prin tf(%dn,ai);自定义函数形式void sort(i nt a, i nt n)int i,j,imi n,s;for(i=0;i n-1;i+) imi n=i;for(j=i+1;j aj) imi n=j;if(i!=imi n)s=ai; ai=aimi n;aim in=s; 3) 依次类推,选择了 n-

10、1次后,这个数列已按升序排列。2 冒泡法排序(升序)16,17,19,14, 23, 34,8, 33, 45, 56,基本思想:(将相邻两个数比较,小的调到前头)1) 有n个数(存放在数组a(n)中),第一趟将每相邻两个 数比较,小的调到前头,经n-1次两两相邻比较后,最大的数 已“沉底”,放在最后一个位置,小数上升“浮起”;3)依次类推,n个数共进行 行n-j次两两比较。程序段如下void mai n() int a10;int i,j,t;prin tf(i nput 10 nu mbersn); for(i=O;i1O;i+)sca nf(%d, &ai);prin tf(n);for

11、(j=0;jv=8;j+) for(i=0;iai+1)n-1趟比较,在第j趟中要进自定义函数形式:void sort(int a, int n) int i,j,t;for(j=0;j=8;j+)for(i=0;iai+1)t=ai;ai=ai+1;ai+1 =t;2) 第二趟对余下的n-1个数(最大的数已“沉底”)按上 法比较,经n-2次两两相邻比较后得次大的数;t=ai;ai=ai+1;ai+1=t;printf(the sorted numbers:n);for(i=0;i10;i+),,ai);3合并法排序(将两个有序数组 A、B 合并成另一个有 序的数组C,升序)a10: 1,3,

12、5,6b10: 2,4,7,9,10.23c20: 1, 2,3, 4, 5,6, 7,9,10.23基本思想:1)先在 A 、B 数组中各取第一个元素进行比较,将小的 元素放入 C 数组;2)取小的元素所在数组的下一个元素与另一数组中上次 比较后较大的元素比较,重复上述比较过程,直到某个数组被 先排完;3)将另一个数组剩余元素抄入 C 数组,合并排序完成。 程序段如下:void main() int a10,b10,c20,i,ia,ib,ic;printf(please input the first array:n);for(i=0;i10;i+)scanf(%d,&ai); for(i

13、=0;i10;i+)scanf(%d,&bi); printf(n); ia=0;ib=0;ic=0; while(ia10&ib10) if(aiabib) cic=aia;ia+; else cic=bib;ib+; ic+; while(ia=9) cic=aia; ia+;ic+; while(ib=9) cic=bib;ib+;ic+; for(i=0;i20;i+) printf(%dn,ci);六、查找问题1 顺序查找法(在一列数中查找某数 X)思考:将上面程序改写一查找函数 Find,若找到则返回下 标值,找不到返回-1基本思想:一列数放在数组 a1-an中,待查找的关键值为k

14、ey,把key与a数组中的元素从头到尾一一进行比较 查找,若相同,查找成功,若找不到,则查找失败。 (查找子采用另外一种方法自定义函数, 若找到则返回下标值,找不到返回-1:int seek(i nt a,i nt n, int x) int p=0;while(x!=ap&p=n) return -1;else return p;过程如下。in dex :存放找到元素的下 标。)void mai n() int a10,i ndex,x,i;prin tf(please in put the array: n); for(i=0;i10;i+)sca nf(%d, &ai);prin tf(

15、please in put the nu mber you want fin d:n);sca nf(%d, &x);prin tf(n); in dex=-1;for(i=0;i10;i+) if(x=ai) in dex=i; break;if(i ndex=-1)printf(the number is not found!n);elseprintf(the number is found the no%d!n,index); 2折半查找法(只能对有序数列进行查找) 基本思想:设 n 个有序数(从小到大)存放在数组 a1 an中,要查找的数为X。用变量bot、top、mid分别表示查找数

16、 据范围的底部(数组下界) 、顶部(数组的上界)和中间, mid=(top+bot)/2 ,折半查找的算法如下:(1)x=a(mid),则已找到退出循环,否则进行下面的判断;(2)Xa(mid), x 必定落在 mid+1 和 top 的范围之内,即bot=mid+1 ;( 4)在确定了新的查找范围后,重复进行以上比较,直 到找到或者 bot=top。将上面的算法写成如下程序:void main()int a10,mid,bot,top,x,i,find;printf(please input the array:n);for(i=0;i10;i+)scanf(%d,&ai);printf(p

17、lease input the number you want find:n); scanf(%d,&x);printf(n);bot=0;top=9;find=0; while(bottop&find=0) mid=(top+bot)/2;if(x=amid) find=1;break;else if(xap&pp; i-)ai=ai-1;ap=x;main() int aN+1=1,3,4,7,8,11,13,18,56,78, x, i;for(i=0; iN; i+) printf(%d, ai); printf(nInput x:);scanf(%d, &x);insert(a, x

18、);for(i=0; i=N; i+) printf(%d, ai); printf(n);八、矩阵(二维数组)运算(1)矩阵的加、减运算C(i,j)=a(i,j)+b(i,j) 加法C(i,j)=a(i,j)-b(i,j) 减法(2)矩阵相乘(矩阵 A 有 M*L 个元素,矩阵 B 有 L*N 个元素,则矩阵 C=A*B 有M*N 个元素)。矩阵 C中任一元素(i=1,2,m; j=1,2,n)#define M 2#define L 4#define N 3void mv(int aML, int bLN, int cMN) int i, j, k;for(i=0; iM; i+)for(

19、j=0; jN; j+) cij=0;for(k=0; kL; k+)cij+=aik*bkj;main() int aML=1,2,3,4,1,1,1,1;int bLN=1,1,1,1,2,1,2,2,1,2,3,1, cMN;int i, j;mv(a,b,c);for(i=0; iM; i+) for(j=0; jN; j+)printf(%4d, cij);printf(n);(3)矩阵转置算法思想:指将矩阵中元素的行下标和列下标交换,形成 的新矩阵就是原矩阵的转置矩阵。在转置方阵时须注意,只用遍历方阵的上三角形(或下三 角形),将其中的元素和其对应元素进行一次交换即可。如果 是遍历

20、整个方阵,并将每个元素都和它对应元素交换,结果会 发现方阵没有发生变化,原因是每个元素都做了两次交换,最 终又换回到原来的位置上。例:有二维数组a(5,5),要对它实现转置,可用下面两种方式:#define N 3void ch1(int aNN) /*只遍历方阵的上三角形 */ int i, j, t;for(i=0; iN; i+)for(j=i+1; jN; j+) t=aij; aij=aji; aji=t;void ch2(int aNN) /* 只遍历方阵的下三角形 */ int i, j, t;for(i=1; iN; i+) for(j= 0; ji; j+) t=aij;ai

21、j=aji; aji=t; main() int aNN=1,2,3,4,5,6,7,8,9, i, j; ch1(a); /* 或 ch2(a);*/ for(i=0; iN; i+) for(j=0; jN; j+) printf(%4d, aij); printf(n);(4)求二维数组中最小元素及其所在的行和列 基本思路同一维数组,可用下面程序段实现(以二维数组 a34为例):变量 minx 中存放最小值, row,column 存放最小值所在 行列号#define N 4#define M 3void min(int aMN) int min, row, column, i, j;m

22、in=a00;row=0;column=0;for(i=0; iM; i+)for(j=0; jN; j+) if(aijmin) min=aij;row=i;column=j;printf(Min=%dnAt Row%d,Column%dn, min, row, column); main() int aMN=1,23,45,-5,5,6,-7,6,0,33,8,15; min(a);九、迭代法算法思想:对于一个问题的求解 X,可由给定的一个初值X0,根据某一迭代公式得到一个新的值 x1,这个新值x1比初 值X0更接近要求的值X ;再以新值作为初值,即:Xi X0,重 新按原来的方法求 Xi

23、,重复这一过和直到|x1-xO| (某一给定 的精度 )。此时可将 X1 作为问题的解。例:用迭代法求某个数的平方根。 已知求平方根的迭代 公式为:#include float fsqrt(float a) float X0, Xi;Xi=a/2;doX0=Xi;Xi=0.5*(X0+a/X0);while(fabs(Xi-X0)0.0000i);return(Xi);main() float a;scanf(%f, &a);printf(genhao =%fn, fsqrt(a);十、数制转换将一个十进制整数m转换成-r(216)进制字符串。方法:将m不断除r取余数,直到商为零,以反序得到

24、结果。下面写出一转换函数,参数idee为十进制数,ibase为 要转换成数的基(如二进制的基是2,八进制的基是8等),函 数输出结果是字符串。char *trdee(i nt idee, i nt ibase) char strdr20, tint i, idr, p=0;while(idec!=O) idr=idec % ibase ;if(idr=10)strdrp+=idr-10+65;elsestrdrp+=idr+48;idec/=ibase;for(i=0; ivp/2; i+) t=strdri; strdri=strdrp-i-1; strdrp-i-1=t; strdrp=

25、0;main() int x, d;scanf(%d%d, &x, &d);printf(%sn, trdec(x,d);return(strdr);十一、字符串的一般处理1简单加密和解密加密的思想是: 将每个字母 C 加(或减)一序数 K ,即 用它后的第 K 个字母代替,变换式公式: c=c+k例如序数k为5,这时A - F, a- f, B - ?G-当加序数后的字母超过 Z 或 z 则 c=c+k -26例如:You are good Dtz fwj Itti解密为加密的逆过程将每个字母C减(或加)一序数K,即c=c-k,例如序数k为5,这时Z U, z u, 丫T 当加序数 后的字母小于 A 或 a 则 c=c-k +26下段程序是加密处理:#incIudechar *jiami(char stri) int i=0;char strp50,ia;whiIe(strii!= 0) if(strii= A&striiZ) ia-=26;else if(strii= a &strii z

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1