C语言常用算法.docx

上传人:b****6 文档编号:4152919 上传时间:2022-11-28 格式:DOCX 页数:23 大小:28.53KB
下载 相关 举报
C语言常用算法.docx_第1页
第1页 / 共23页
C语言常用算法.docx_第2页
第2页 / 共23页
C语言常用算法.docx_第3页
第3页 / 共23页
C语言常用算法.docx_第4页
第4页 / 共23页
C语言常用算法.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

C语言常用算法.docx

《C语言常用算法.docx》由会员分享,可在线阅读,更多相关《C语言常用算法.docx(23页珍藏版)》请在冰豆网上搜索。

C语言常用算法.docx

C语言常用算法

一、累加累乘

基本知识:

S=S+X累加0

X=X+1计数0

T=T*X累乘求Xn1

T=T*I累乘求N!

1

应用:

级数求和

1.输入x、n后输出下列算式的值。

(次数控制)

[程序1]

#include

voidmain()

{floats,t,x,t1=1.0,t2=1.0;inti,n;

scanf("%f%d",&x,&n);

s=0,t=-1;

for(i=1;i<=n;i++){

t1=t1*x;

t2=t2*i;

t=-t;s=s+t*t1/t2;}

printf(“%f”,s);

}

[程序2]

#include

floatf1(floatx,intn)

{floaty=1.0;intk;

for(k=0;k

y=y*x;

returny;

}

longf2(intn)

{longm=1;intk;

for(k=1;k<=n;k++)

m=m*k;

returnm;

}

voidmain()

{floats,t,x;inti,n;

scanf("%f%d",&x,&n);

s=0,t=-1;

for(i=1;i<=n;i++)

{t=-t;s=s+t*f1(x,i)/f2(i);}

printf(“%f”,s);

}

二、整除性

基本知识:

x%y==0

(int)(x/y)==x/y

fmod(x,y)==0

应用:

1.素数(质数)

#include

#include

voidmain()

{

intm,i,n=0;

do{

scanf(“%d”,&m);

n=sqrt(m);

for(i=2;i<=n;i++)

if(m%i==0)break;

if(i>n)

printf(“%d”,m);}

while(m!

=0);/*输入0结束*/

}

[素数2]

#include

#include

intprime(intm)

{intk,p;

p=sqrt(m);

for(k=2;k<=p;k++)

if(m%k==0)return0;

return1;

}

voidmain()

{

intm,i,n=0;

do{

scanf(“%d”,&m);

if(prime(m))

printf(“%d是素数.”,m);

else

printf(“%d不是素数.”,m);

}

2.水仙花数:

若某数等于各位数字的立方和,则称该数为水仙花数

for(i=100;i<=999;i++)

{a=i%10;

b=i/10%10;

c=i/100;

if(a*a*a+b*b*b+c*c*c==i)

printf(“%d”,&i);

}

输入一个整数判断是否是水仙花数.

scanf(“%d”,&m);t=0;n=m;

while(n>0)

{k=n%10;t=t+k*k*k;n=n/10;}

if(m==t)printf(“%d是水仙花数.”,m);

[水仙花数]

#include

intf(intm)

{intk,n,t;

n=m;t=0;

while(n>0)

{k=n%10;t=t+k*k*k;n=n/10;}

if(m==t)return1;

elsereturn0;

}

voidmain()

{

intm;

do

{scanf(“%d”,&m);

if(f(m))printf(“%d是水仙花数.”,m);

elseprintf(“%d不是水仙花数.”,m);

}while(m!

=0);

}

3.完数:

某数等于其诸因子之和则该数为完数,如6=1+2+3,28=1+2+4+7+14则6、28就是完数。

#include

#include

voidmain()

{intn,i,s;

for(n=6;n<=1000;n++)

{s=0;

for(i=1;i<=n/2;i++)

if(n%i==0)s+=i;

if(n==s)fprintf(p,"%6d",n);

}

4.数位截取:

输入一个长整型数,求各位数字的平方和

#include

voidmain()

{intdigit;

longin,s;

scanf(“%ld”,in);

if(in<0)in=-in;

s=0;

while(in>0)

{digit=in%10;

s=s+digit*digit

in=in/10;

printf(“sum=%ld\n”,s);

5.最大公约数、最小公倍数

#include

voidmain()

{intm,n,k,t,p;

scanf("%d%d",&m,&n);

if(m>n){k=m;p=n;}

else{k=n;p=m;}

while((t=(k%p))!

=0)

{

k=p;

p=t;

}

printf("gongyueshu=%d\n",p);

printf("gongbeishu=%d\n",m*n/p);

}

6.亲密数对:

说明:

若a、b为1对亲密数,则a的因子和等于b、b的因子和等于a、且a不等于b。

如:

220、284是1对亲密数,284、220也是1对亲密数。

#include

voidmain()

{

inta,b,c,i;

for(a=6;a<=5000;a++)

{

b=c=0;

for(i=1;i

if(a%i==0)

b=b+i;

for(i=1;i

if(b%i==0)

c=c+i;

if(a==c&&a!

=b)

printf("%6d,%6d\n",a,b);

}

}

方法2:

用函数

#include

longs(intm)

{

intj;longsum=0;

for(j=1;j<=m/2;j++)

if(m%j==0)sum=sum+j;

returnsum;

}

voidmain()

{

inta,b;longc1,c2;

scanf(“%d%d”,&a,&b);

c1=s(a);c2=s(b);

if((a!

=b)&&(c1==b)&&(c2==a))

printf("%6d,%6d\n",a,b);

}

三、最大最小

1.从输入的若干个正数中选出最小数

#include

voidmain()

{

floatx,min;

scanf("%f",&x);

min=x;

while(x>=0){

if(x

min=x;

scanf("%f",&x);

}

printf("theminiumnumberis%f",min);

}

2.编制函数,其功能是在float类型1维数组中查找最大值、最小值,并将它们返回到调用程序。

#include

voidmax_min(intx[],intn,int*max,int*min)

{inti;

*max=x[0];*min=x[0];//max=&x[0],min=&x[0];

for(i=1;i

{

if(*max

*max=x[i];

if(x[i]<*min)

*min=x[i];

}

}

voidmain()

{intx[10],i,min,max;

for(i=0;i<10;i++)

scanf("%d",x+i);

max_min(x,10,&max,&min);

printf("MAX=%dMIN=%d\n",max,min);

}

四、双重循环

1.求

(n由输入决定)

#include

voidmain()

{

inti,j,n;

longintt=1,sum=0;

scanf("%d",&n);

for(i=1;i<=n;i++){

t=1;

for(j=1;j<=2*i-1;j++)

t=t*j;

sum=sum+t;

}

printf("n!

=%ld",sum);

}

2.输入一个3*6的二维整型数组数据,输出其中最大值及其所在行列下标。

#include

voidmain()

{

inta[3][6],i,j,m,n,max;

for(i=0;i<3;i++)

for(j=0;j<6;j++)

scanf("%d",&a[i][j]);

max=a[0][0];

for(i=0;i<3;i++)

for(j=0;j<6;j++)

if(a[i][j]>max)

{

max=a[i][j];

m=i;n=j;

}

printf("themaxnumis%d,row%dline%d\n",max,m,n);

}

3.鞍点问题:

找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小

#defineN10

#defineM10

voidmain()

{

inti,j,k,m,n,flag1,flag2,a[N][M],max,maxi,maxj;

scanf("%d",&n);

scanf("%d",&m);

for(i=0;i

for(j=0;j

scanf("%d",&a[n][m]);

for(i=0;i

{

for(j=0;j

printf("%d",a[n][m]);

printf("\n");

}

flag2=0;

for(i=0;i

max=a[i][0];

for(j=0;j

if(a[i][j]>max)

{

max=a[i][j];

maxj=j;

}

for(k=0,flag1=1;k

if(max>a[k][maxj])

flag1=0;

if(flag1)

{

printf("\n第%d行,第%d列的%d是鞍点",i,maxj,max);

flag2=1;

}

}

if(!

flag2)printf("\n矩阵中无鞍点");

}

五、三种排序

1.选择排序:

函数sort使用选择法将一维整型数组中各元素按值从大到小排序。

#include

#defineN10

voidsort(inta[],intn)

{inti,j,k,temp;

for(i=0;i

k=i;

for(j=i+1;j

if(a[k]

temp=a[k];a[k]=a[i];a[i]=temp;

}

}

voidmain()

{

inta[N],i;

for(i=0;i

scanf("%d",&a[i]);

sort(a,N);

for(i=0;i

printf("%d",a[i]);

}

2.冒泡法

#include

voidmain()

{

inta[10],i,j,t;

printf("Input10numbers:

\n");

for(i=0;i<10;i++)/*输入排序数*/

scanf("%d",&a[i]);

printf("\n");

for(j=0;j<9;j++)/*控制比较趟数*/

for(i=0;i<9-j;i++)/*控制比较对数*/

if(a[i]>a[i+1])

{

t=a[i];

a[i]=a[i+1];

a[i+1]=t;

}

printf("Thesortednumber:

\n");

for(i=0;i<10;i++)/*输出已排序的数*/

printf("%d",a[i]);

}

3.插入排序:

将x插入到已从小到大排序好的数组a中,插入x后数组中的元素仍然有序

#include

#defineN5

voidmain()

{

inta[N],i,x,j;

scanf("%d",&a[0]);

for(i=1;i

{

scanf("%d",&x);

for(j=i-1;j>=0;j--)

if(a[j]>x)

a[j+1]=a[j];

elsebreak;

a[j+1]=x;

}

}

for(i=0;i

printf("%d",a[i]);

}

六、二种查找

1.顺序查找

设a是一个整型数组,n和x都是整数,数组a中各元素的值互异。

请编写函数find(a,n,x),在数组a的前n个元素中查找x,如果找到,返回x在数组a中的位置;如果没有找到,返回0。

#include

#defineN5

intfind(int*a,intn,intx)

{

intk=0,y=0;

for(k=0;k

if(a[k]==x)y=k+1;

returny;

}

voidmain()

{

intn,x,a[N],i;

for(i=0;i

scanf("%d",&a[i]);

printf("pleaseinputxandn\n");

scanf("%d%d",&x,&n);

while(x!

=0){

if((i=find(a,n,x))!

=0)

printf("%disthe%dthnumber",x,i);

else

printf("notfound");

scanf("%d,%d",&x,&n);

}

}

2.二分法查找(要求查找的数据要有序)

#include

#defineN10

intf(intx,inta[],intn)

{

intlow,high,mid;

low=0;high=n-1;

inty=-1;

while(low<=high){

mid=(low+high)/2;

if(x>a[mid])low=mid+1;

elseif(x

else{y=mid;break;}

}

returny;

}

voidmain()

{

inti,x,n,a[N];

for(i=0;i

scanf("%d",&a[i]);

printf("pleaseinputxandn");

scanf("%d%d",&x,&n);

printf("%d\n",f(x,a,n));

}

七.三种遍历

1.数组遍历

1)字符串与整数转换

说明】函数atoi的功能是将字符串转换成整数,如“atoi("-123")”将返回-123。

#include

intatoil(chars[])

{

intk=0,sign,digit;

sign=1;

digit=0;

while(s[k]<'0'||s[k]>'9')

{

if(s[k]=='-')

{

sign=-1;

}

k++;

}

while(s[k]>='0'&&s[k]<='9')

{

digit=digit*10+s[k]-'0';

k++;

}

returnsign*digit;

}

voidmain()

{

chars[80];

intd;

scanf("%s",s);

d=atoil(s);

printf("%d",d);

}

2)数组逆置

(1)for(i=0;i<=n/2;i++)

{t=a[i];a[i]=a[n-i-1];a[n-i-1]=t;}

(2)for(i=0,j=n-1;i

{t=a[i];a[i]=a[j];a[j]=t;}

如何用指针表示?

3)strcpy,strcmp,strlen,strcat这四个函数用数组,指针实现

#include

voidstrcpy1(char*to,char*from)

{

while((*to=*from)!

='\0')

{

to++;

from++;

}

}

voidmain()

{

charto[20],from[10];

scanf("%s%s",from,to);

strcpy1(to,from);

printf("%s\n",to);

}

4)进制转换

函数xtoi的功能是将放在字符串中的十六进制数(可以出现’0’~’9’、’a’~’f)转换成十进制整数。

例如:

调用xtoi("1f")将返回31。

#include

intxtoi1(chars[])

{

intk=0,d=0;

while(s[k]>='0'&&s[k]<='9'||s[k]>='a'&&s[k]<='f')

{

if(s[k]>='0'&&s[k]<='9')

d=d*16+s[k]-'0';

if(s[k]>='a'&&s[k]<='f')

d=d*16+s[k]-87;

k++;

}

returnd;}

voidmain()

{

chars[80];

intd;

scanf("%s",s);

d=xtoi1(s);

printf("%d",d);

}

2.链表遍历

链表的建立、插入、删除和输出

3.文件遍历

(1)下列程序将当前目录下的文本文件a.txt复制到b.txt,要求将a.txt中每1个非英文字符后的第1个小写英文字母改为大写字母写到文件b.txt中,其它字符复制时不变。

#include

#include

#include

voidmain()

{FILE*f1,*f2;

intflag=1;

charch;

if((f1=fopen("a.txt","r"))==NULL){

printf("不能打开文件a.txt\n");exit(0);

}

if((f2=fopen("b.txt","w"))==NULL){

printf("不能打开文件b.txt\n");exit(0);

}

while(!

feof(f1)){

ch=fgetc(f1);

if(flag==1&&ch>='a'&&ch<='z')

fputc(ch-32,f2);

  else

fputc(ch,f2);

if(!

isalpha(ch))flag=1;

elseflag=0;

}

fclose(f1);fclose(f2);

}

八.函数调用

1,值传递,地址传递

#includeintx,y,z;voidp(int*x,inty){++*x;y--;z=*x+y;2

printf("%d,%d,%d--",*x,y,z);

}voidmain(){x=2;y=3;z=4;p(&x,y);printf("%d,%d,%d--",x,y,z);p(&y,x);printf("%d,%d,%d\n",x,y,z);}2.静态局部变量

(1)函数f定义如下,执行语句“sum=f(5)+f(3);”后,sum的值应为(35)。

intf(intm)

{staticinti=0;ints=0;

for(;i<=m;i++)s+=i;returns;

}

A、21B、16C、15D、8

(2)写出下列程序的输出结果:

#include

intf(intx)

{staticy=1;

x+=y;y++;

returnx;

}

voidmain()

{intk;

k=f(3);

printf("%d%d\n",k,f(k));

}

3.递归调用

(1)函数f定义如下,执行语句“m=f(5);”后,m的值应为B。

intf(intk)

{if(k==0||k==1)return1;

elsereturnf(k-1)+f(k-2);

}

A、3B、8C、5D、13

九.其他算法1.数学类问题(上机题)

1.程序设计题:

考生目录下有Design.c程序,请完成以下功能:

数组元素x[i]、y[i]表示

平面上某点坐标,统计10个点中同处在圆(x-1)*(x-1)+(y+0.5)*(y+0.5)=25与

(x-0.5)*(x-0.5)+y*y=36内的点数k,并将变量k的值以格式"%d"写到考生目录下

新建文件design.dat。

#include

#include

voidmain()

{FILE*p;inti,k=0;

floatx[]={1.1,3.2,-2.5,5.67,3.42,-4.5,2.54,5.6,0.97,4.65};

floaty[]={-6,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

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

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