C语言常用算法

发布时间:2015-03-31 14:37:55   来源:文档文库   
字号:

一、 累加累乘

基本知识:

S=S+X 累加 0

X=X+1 计数 0

T=T*X 累乘 Xn 1

T=T*I 累乘 N 1

应用:级数求和

1.输入xn后输出下列算式的值。(次数控制)

[程序1]

#include

void main( )

{ float s, t, x,t1=1.0,t2=1.0; int i, 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

float f1(float x , int n) //xn

{ float y=1.0; int k;

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

y=y*x;

return y;

}

long f2(int n) //n!

{ long m=1; int k;

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

m=m*k;

return m;

}

//递归实现

double f3(float x,int n)

{

if(n==0) return 1;

else

return x*f3(x,n-1);

}

double f4(int n) //n!

{

if(n==0 || n==1) return 1;

else

returm n*f4(n-1);

}

double f5(int n) //斐波那契数列第n

{

if(n==1 || n==2) return 1;

else return f5(n-1)+f5(n-2);

}

double sum(int n) //1+2+…+n

{

if(n==1) return 1;

else return n+sum(n-1);

}

void main( )

{ float s, t, x; int i, 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

void main()

{

int m,i,n=0;

do {

scanf(“%d”,&m);

n=sqrt(m); //n=m/2;

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

if(m%i==0) break;

if(i>n)

printf(“ %d”,m);}

while(m!=0);/*输入0结束*/

}

[素数2]

#include

#include

int prime(int m)

{ int k;

if(m==1) return 0;

for(k=2;k<= m/2;k++)

if(m%k==0) return 0;

return 1;

}

void main()

{

int m,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

int f(int m)

{ int k,n,t;

n=m; t=0;

while(n!=0)

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

if(m==t) return 1;

else return 0;

}

void main()

{

int m;

do

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

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

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

}while(m!=0);

}

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

#include

#include

void main()

{ int n,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

void main()

{int digit;

long in,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

void main()

{ int m,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("gong yue shu= %d\n",p);

printf("gong bei shu= %d\n",m*n/p);

}

6.亲密数对:说明:若ab1对亲密数,则a的因子和等于bb的因子和等于a、且a不等于b。如:2202841对亲密数,284220也是1对亲密数。

#include

void main()

{

int a,b,c,i;

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

{

b=0

for(i=1;i

if(a%i==0)

b=b+i;

c=0;

for(i=1;i

if(b%i==0)

c=c+i;

if(a==c && a!=b)

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

}

}

三、 最大最小

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

#include

void main()

{

float x,min;

scanf("%f",&x);

min=x;

while(x>=0){

if(x

min=x;

scanf("%f",&x);

}

printf("the minium number is %f",min);

}

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

#include

void max_min(int x[ ], int n, int *max, int *min)

{ int i;

*max=x[0]; *min=x[0];

for(i=1;i

{

if(*max

*max=x[i];

if(x[i]<*min)

*min=x[i];

}

}

void main( )

{int x[10],i,min,max;

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

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

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

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

}

四、 双重循环

1. n由输入决定)

#include

void main( )

{

int i,j,n;

long int t=1,sum=0;

scanf("%d",&n);

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

t=1;

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

t=t*j;

sum=sum+t;

}

printf("n!=%ld",sum);

}

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

#include

void main( )

{

int a[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("the max num is %d, row %d line %d \n",max,m,n);

}

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

#define N 10

#define M 10

void main()

{

int i,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

#define N 10

void sort(int a[],int n)

{ int i,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;

}

}

void main()

{

int a[N],i;

for(i=0;i

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

sort(a,N);

for(i=0;i

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

}

2. 冒泡法

#include

void main( )

{

int a[10] , i , j ,t ;

printf("Input 10 numbers:\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(" The sorted number : \n") ;

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

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

}

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

#include

#define N 5

void main()

{

int a[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];

else break;

a[j+1]=x;

}

}

for(i=0;i

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

}

六、 二种查找

1. 顺序查找

a是一个整型数组,nx都是整数,数组a中各元素的值互异。请编写函数 find(a,n,x),在数组a的前n个元素中查找x, 如果找到,返回x在数组a中的位置;如果没有找到,返回0

#include

#define N 5

int find(int *a, int n, int x)

{

int k=0,y=0;

for(k=0; k

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

return y;

}

void main()

{

int n,x,a[N],i;

for(i=0;i

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

printf("please input x and n\n");

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

while(x!=0){

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

printf("%d is the %dth number",x,i);

else

printf("not found");

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

}

}

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

#include

#define N 10

int f(int x, int a[], int n)

{

int low,high, mid;

low=0; high=n-1;

int y=-1;

while(low<=high){

mid=(low+high) / 2;

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

else if(x

else {y=mid;break;}

}

return y;

}

void main()

{

int i,x,n,a[N];

for(i=0;i

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

printf("please input x and n");

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

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

}

七.三种遍历

1. 数组遍历

1字符串与整数转换

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

int atoil(char s[])

{

int k=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++;

}

return sign*digit;

}

void main()

{

char s[80];

int d;

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

void strcpy1(char*to,char *from)

{

while((*to=*from)!='\0')

{

to++;

from++;

}

}

void main()

{

char to[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

int xtoi1(char s[])

{

int k=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++;

}

return d;}

void main()

{

char s[80];

int d;

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

void main()

{ FILE *f1,*f2 ;

int flag=1;

char ch;

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;

else flag=0;

}

fclose(f1); fclose(f2);

}

. 函数调用

1,值传递,地址传递

#include int x,y,z; void p(int *x,int y) { ++*x; y--; z=*x+y;2

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

} void main() { 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

int f(int m)

{ static int i=0; int s=0;

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

}

A21 B16 C15 D8

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

# include

int f(int x)

{ static y=1;

x+=y; y++;

return x;

}

void main()

{ int k;

k=f(3);

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

}

3.递归调用

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

int f(int k)

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

else return f(k-1)+f(k-2);

}

A3 B8 C5 D13

九.其他算法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

void main()

{ FILE *p; int i,k=0;

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

float y[]={-6,4.3,4.5,3.67,2.42,2.54,5.6,-0.97,4.65,-3.33};

// 此处起要求考生自己编制程序

p=fopen("design.dat", "w");

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

if((sqrt((x[i]-1)*(x[i]-1)+(y[i]+0.5)*(y[i]+0.5))<5)&&

sqrt(((x[i]-0.5)*(x[i]-0.5)+(y[i]*y[i]))<6))

k++;

fprintf(p,"%d",k);

fclose(p);

}

2. 程序设计题:考生目录下有Design.c程序,请完成以下功能:数组元素x[i]y[i]表示平面上某点坐标,统计所有各点间最短距离,并将其值以格式"%f"写到考生目录下新建文

design.dat

#include

#include

#define len(x1,y1,x2,y2) sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

void main()

{ FILE *p; int i,j; float c,minc;

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

float y[]={-6,4.3,4.5,3.67,2.42,2.54,5.6,-0.97,4.65,-3.33};

minc=len(x[0],y[0],x[1],y[1]);

// 此处起要求考生自己编制程序

p=fopen("design.dat", "w");

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

for(j=i+1;j<10;j++)

if((c=len(x[i],y[i],x[j],y[j]))

minc=c;

fprintf(p,"%f",minc);

fclose(p);

}

2.结构体

输入某班30位学生的姓名及数学,英语,计算机三门课成绩,输出平均成绩>=60分的学生的姓名及其各门课的成绩。

#include

#define SIZE 30

struct student

{ char name[10];

int math, english, computer;

};

void main()

{ struct student s[SIZE];

int k,j,n,d[SIZE];

float average;

for(k=0;k 1 );

for(n=0,k=0;k

{

average=(s[k].math+s[k].englksh+s[k].computer)/3.0;

if ( 2 )

{

d[n]=k;

3 ;

}

}

for (k=0;k

{

j= 4 ;

printf("%10s %3d %3d%3d\n",s[j].name,s[j].math,s[j].english,s[j].computer);

}

}

2. 分支程序

阅读下列程序,写出运行结果。

程序18分)

#include

void main()

{ int m=18,s=0;

do {

switch(m%7) {

case 2 : m/=2;s+=2; break;

case 3 : m/=3;s+=3; break;

case 5 : m/=5;s+=5; break;

default : m--; s--;

};

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

} while(m);

}

3. 指针

#include

void main()

{ void div(int*,int*);

int a[5]={-5,0,60,45,34},i=0,j=2;

while(a[i]<=0)

i++;

while(a[i]!=1)

div(a+i,&j);

}

void div(int *n,int *k)

{ if(*n%*k==0) {

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

*n/=*k;

}

else (*k)++;

}

程序33分)位运算

#include

void main()

{ int s[8],i; char ch='B'-1; /* 字符AASCII码为65 */

printf("%c %d\n",ch,ch);

for(i=7;i>=0;i--) {

s[i]=ch&1;

ch=ch>>1;

}

for(i=0;i<8;i++) printf("%d",s[i]);

printf("\n");

}

算法口诀:

累加累乘整除性,最大最小双重循,

二查三排三遍历,函数调用文件行。

本文来源:https://www.2haoxitong.net/k/doc/3b770e372b160b4e767fcfa6.html

《C语言常用算法.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式