C程序设计的常用算法Word文档下载推荐.docx
- 文档编号:20773636
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:12
- 大小:22KB
C程序设计的常用算法Word文档下载推荐.docx
《C程序设计的常用算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C程序设计的常用算法Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
(3)若r=0,则n为求得的最大公约数,算法结束;
否则执行(4);
(4)m←n,n←r,再重复执行
(2)。
例如:
求m=14,n=6的最大公约数.mnr
1462
620
{intnm,r,n,m,t;
pleaseinputtwonumbers:
scanf("
%d,%d"
&
m,&
n);
nm=n*m;
if(m<
n)
{t=n;
n=m;
m=t;
}
r=m%n;
while(r!
=0)
{m=n;
n=r;
r=m%n;
最大公约数:
%d\n"
n);
最小公倍数:
nm/n);
三、判断素数
只能被1或本身整除的数称为素数基本思想:
把m作为被除数,将2—INT()作为除数,如果都除不尽,m就是素数,否则就不是。
(可用以下程序段实现)
{intm,i,k;
pleaseinputanumber:
%d"
m);
k=sqrt(m);
for(i=2;
k;
if(m%i==0)break;
if(i>
=k)
该数是素数"
else
该数不是素数"
将其写成一函数,若为素数返回1,不是则返回0
intprime(m%)
{inti,k;
if(m%i==0)return0;
return1;
四、验证哥德巴赫猜想
(任意一个大于等于6的偶数都可以分解为两个素数之和)
基本思想:
n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。
如n1不是素数,就不必再检查n2是否素数。
先从n1=3开始,检验n1和n2(n2=N-n1)是否素数。
然后使n1+2再检验n1、n2是否素数,…直到n1=n/2为止。
利用上面的prime函数,验证哥德巴赫猜想的程序代码如下:
#include"
math.h"
intprime(intm)
{inti,k;
return0;
main()
{intx,i;
pleaseinputaevennumber(>
=6):
x);
if(x<
6||x%2!
dataerror!
=x/2;
if(prime(i)&
&
prime(x-i))
{
%d+%d\n"
i,x-i);
验证成功!
"
break;
五、排序问题
1.选择法排序(升序)
基本思想:
1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;
2)除第1个数外,其余n-1个数中选最小的数,与第2个数交换位置;
3)依次类推,选择了n-1次后,这个数列已按升序排列。
程序代码如下:
{inti,j,imin,s,a[10];
\ninput10numbers:
10;
a);
9;
{imin=i;
for(j=i+1;
j<
j++)
if(a[imin]>
a[j])imin=j;
if(i!
=imin)
{s=a;
a=a[imin];
a[imin]=s;
2.冒泡法排序(升序)
(将相邻两个数比较,小的调到前头)
1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;
2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;
3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。
程序段如下
{inta[10];
inti,j,t;
input10numbers\n"
for(j=0;
=8;
9-j;
if(a>
a[i+1])
{t=a;
a=a[i+1];
a[i+1]=t;
thesortednumbers:
3.合并法排序(将两个有序数组A、B合并成另一个有序的数组C,升序)
1)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组;
2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完;
3)将另一个数组剩余元素抄入C数组,合并排序完成。
程序段如下:
{inta[10],b[10],c[20],i,ia,ib,ic;
pleaseinputthefirstarray:
b);
ia=0;
ib=0;
ic=0;
while(ia<
10&
ib<
10)
{if(a[ia]<
b[ib])
{c[ic]=a[ia];
ia++;
{c[ic]=b[ib];
ib++;
ic++;
=9)
while(ib<
b++;
20;
c);
六、查找问题
1.①顺序查找法(在一列数中查找某数x)
一列数放在数组a[1]---a[n]中,待查找的数放在x中,把x与a数组中的元素从头到尾一一进行比较查找。
用变量p表示a数组元素下标,p初值为1,使x与a[p]比较,如果x不等于a[p],则使p=p+1,不断重复这个过程;
一旦x等于a[p]则退出循环;
另外,如果p大于数组长度,循环也应该停止。
(这个过程可由下语句实现)
{inta[10],p,x,i;
pleaseinputthearray:
pleaseinputthenumberyouwantfind:
p=0;
while(x!
=a[p]&
p<
p++;
if(p>
=10)
thenumberisnotfound!
thenumberisfoundtheno%d!
p);
思考:
将上面程序改写一查找函数Find,若找到则返回下标值,找不到返回-1
②基本思想:
一列数放在数组a[1]---a[n]中,待查找的关键值为key,把key与a数组中的元素从头到尾一一进行比较查找,若相同,查找成功,若找不到,则查找失败。
(查找子过程如下。
index:
存放找到元素的下标。
)
{inta[10],index,x,i;
index=-1;
if(x==a)
{index=i;
break;
if(index==-1)
index);
2.折半查找法(只能对有序数列进行查找)
设n个有序数(从小到大)存放在数组a[1]----a[n]中,要查找的数为x。
用变量bot、top、mid分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间,mid=(top+bot)/2,折半查找的算法如下:
(1)x=a(mid),则已找到退出循环,否则进行下面的判断;
(2)x<
a(mid),x必定落在bot和mid-1的范围之内,即top=mid-1;
(3)x>
a(mid),x必定落在mid+1和top的范围之内,即bot=mid+1;
(4)在确定了新的查找范围后,重复进行以上比较,直到找到或者bot<
=top。
将上面的算法写成如下程序:
inta[10],mid,bot,top,x,i,find;
bot=0;
top=9;
find=0;
while(bot<
top&
find==0)
{mid=(top+bot)/2;
if(x==a[mid])
{find=1;
elseif(x<
a[mid])
top=mid-1;
bot=mid+1;
if(find==1)
mid);
七、插入法
把一个数插到有序数列中,插入后数列仍然有序
n个有序数(从小到大)存放在数组a
(1)—a(n)中,要插入的数x。
首先确定x插在数组中的位置P;
(可由以下语句实现)
#defineN10
voidinsert(inta[],intx)
{intp,i;
while(x>
a[p]&
N)
for(i=N;
i>
p;
i--)
a=a[i-1];
a[p]=x;
{inta[N+1]={1,3,4,7,8,11,13,18,56,78},x,i;
i<
N;
i++)printf("
%d,"
a);
\nInputx:
&
insert(a,x);
=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)
#defineM2
#defineL4
#defineN3
voidmv(inta[M][L],intb[L][N],intc[M][N])
{inti,j,k;
M;
i++)
j<
j++)
{c[j]=0;
for(k=0;
k<
L;
k++)
c[j]+=a[k]*b[k][j];
{inta[M][L]={{1,2,3,4},{1,1,1,1}};
intb[L][N]={{1,1,1},{1,2,1},{2,2,1},{2,3,1}},c[M][N];
inti,j;
mv(a,b,c);
{for(j=0;
c[j]);
(3)矩阵传置
例:
有二维数组a(5,5),要对它实现转置,可用下面两种方式:
voidch1(inta[N][N])
{inti,j,t;
{t=a[j];
a[j]=a[j];
a[j]=t;
voidch2(inta[N][N])
for(j=0;
i;
{inta[N][N]={{1,2,3},{4,5,6},{7,8,9}},i,j;
ch1(a);
/*或ch2(a);
*/
a[j]);
(4)求二维数组中最小元素及其所在的行和列
基本思路同一维数组,可用下面程序段实现(以二维数组a[3][4]为例):
‘变量max中存放最大值,row,column存放最大值所在行列号
#defineN4
#defineM3
voidmin(inta[M][N])
{intmin,row,column,i,j;
min=a[0][0];
row=0;
column=0;
if(a[j]<
min)
{min=a[j];
row=i;
column=j;
Min=%d\nAtRow%d,Column%d\n"
min,row,column);
{inta[M][N]={{1,23,45,-5},{5,6,-7,6},{0,33,8,15}};
min(a);
九、迭代法
算法思想:
对于一个问题的求解x,可由给定的一个初值x0,根据某一迭代公式得到一个新的值x1,这个新值x1比初值x0更接近要求的值x;
再以新值作为初值,即:
x1→x0,重新按原来的方法求x1,重复这一过和直到|x1-x0|<
ε(某一给定的精度)。
此时可将x1作为问题的解。
例:
用迭代法求某个数的平方根。
已知求平方根的迭代公式为:
#include<
math.h>
floatfsqrt(floata)
{floatx0,x1;
x1=a/2;
do{
x0=x1;
x1=0.5*(x0+a/x0);
}while(fabs(x1-x0)>
0.00001);
return(x1);
{floata;
%f"
genhao=%f\n"
fsqrt(a));
十、数制转换
将一个十进制整数m转换成→r(2-16)进制字符串。
方法:
将m不断除r取余数,直到商为零,以反序得到结果。
下面写出一转换函数,参数idec为十进制数,ibase为要转换成数的基(如二进制的基是2,八进制的基是8等),函数输出结果是字符串。
char*trdec(intidec,intibase)
{charstrdr[20],t;
inti,idr,p=0;
while(idec!
{idr=idec%ibase;
if(idr>
strdr[p++]=idr-10+65;
strdr[p++]=idr+48;
idec/=ibase;
p/2;
{t=strdr;
strdr=strdr[p-i-1];
strdr[p-i-1]=t;
strdr[p]=’\0’;
return(strdr);
{intx,d;
%d%d"
x,&
d);
%s\n"
trdec(x,d));
十一、字符串的一般处理
1.简单加密和解密
加密的思想是:
将每个字母C加(或减)一序数K,即用它后的第K个字母代替,变换式公式:
c=c+k
例如序数k为5,这时A→F,a→f,B→?
G…当加序数后的字母超过Z或z则c=c+k-26
例如:
Youaregood→Dtzfwjltti
解密为加密的逆过程
将每个字母C减(或加)一序数K,即c=c-k,
例如序数k为5,这时Z→U,z→u,Y→T…当加序数后的字母小于A或a则c=c-k+26
下段程序是加密处理:
stdio.h>
char*jiami(charstri[])
{inti=0;
charstrp[50],ia;
while(stri!
=’\0’)
{if(stri>
=’A’&
stri<
=’Z’)
{ia=stri+5;
if(ia>
’Z’)ia-=26;
elseif(stri>
=’a’&
=’z’)
’z’)ia-=26;
elseia=stri;
strp[i++]=ia;
strp=’\0’;
return(strp);
{chars[50];
gets(s);
jiami(s));
2.统计文本单词的个数
输入一行字符,统计其中有多少个单词,单词之间用格分隔开。
算法思路:
(1)从文本(字符串)的左边开始,取出一个字符;
设逻辑量word表示所取字符是否是单词内的字符,初值设为0
(2)若所取字符不是“空格”,“逗号”,“分号”或“感叹号”等单词的分隔符,再判断word是否为1,若word不为1则表是新单词的开始,让单词数num=num+1,让word=1;
(3)若所取字符是“空格”,“逗号”,“分号”或“感叹号”等单词的分隔符,则表示字符不是单词内字符,让word=0;
(4)再依次取下一个字符,重得
(2)(3)直到文本结束。
下面程序段是字符串string中包含的单词数
stdio.h"
{charc,string[80];
inti,num=0,word=0;
gets(string);
(c=string)!
='
\0'
;
if(c=='
'
)word=0;
elseif(word==0)
{word=1;
num++;
prin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 常用 算法