金城学院09-10年C语言常用算法总结
(请注意不要随意传播)
一、第五章常用算法总结
(1)分段函数的计算
/***** P8 5.20 *****/
main( )
{
int x,y;
scanf("%d",&x);
if ( x>2 && x<=10 ) y=x*(x+2);
else if ( x>-1 && x<=2 ) y=2*x;
else if (x<=-1) y=x-1;
else y=-1;
printf(“%d %d \n”,x, y );
}
/* P37 实验四 1 */
# include <stdio.h>
main( )
{
int x,y;
scanf("%d",&x);
if (x<1) y=x;
else if ( x<10 ) y=2*x-1;
else y=3*x-11;
printf("%d %d \n",x,y);
}
二、第六章常用算法总结
(1)多项式累加和、累乘积;
/* P11 6.8 */
# include <stdio.h>
main()
{
int a,b,c,i;
a=c=0;
for ( i=0;i<=10;i=i+2)
{
a+=i;
b=i+1;
c+=b;
}
printf("sum of the even=%d\n",a);
printf("sum of the odd =%d\n",c-11);
}
实验五 2 求1!+2!+3!+4!+5!+…
main()
{
int s=0,i,t=1;
for (i=1;i<=5;i++)
{
t=t*i;
s=s+t;
}
printf("1!+2!+3!+4!+5!=%d \n",s);
}
下面程序的功能是:有一个分数序列,求出这个序列的前20项之和,请填空。
#include<stdio.h>
main()
{ float a=2,b=1,sum=0,t;
_int i ;____
for( i=1; i<=20;i++)
{ sum+= a/b;
t=a;
a+=b;
b=t;
}
printf("sum=%f\n",sum);
}
下面pi函数的功能是根据以下的公式,返回满足精度e要求的p的值,请填空。
main( )
{ double eps=1e-6,s=0,t=1.0;
int n ;
for ( n=1; t > eps ; n++ )
{
s += t ;
t = t *n / (2*n + 1 ) ;
}
printf("PI=%f \n",2*s);
}
(2)求素数(判断素数);
# include <math.h>
main()
{
int i,m,k;
scanf("%d",&m);
k=sqrt(m);
for (i=2;i<=k;i++)
if ( m%i ==0 ) break;
if (i==k+1) printf("%d is a prime . \n",m);
else printf("%d is not a prime. \n",m);
}
(3)数的分解,如水仙花数,完数等;
*用数组和循环实现数的分解
#include <stdio.h>
void main( )
{ long n; int a[5], i=0, k;
scanf(“%d”&n);
while(n>0)
{ a[i]=n%10;
n=n/10;
i++;
}
printf(“ws=%d \n”, i );
for(k=i-1; k>=0; k--)
printf(“ %4d ”,a[k]);
printf(“\n”);
for (k=0; k<i; k++)
printf(“%4d ”,a[k]);
printf(“\n”);
}
*打印出所有的“水仙花数”。
#include <stdio.h>
void main( )
{ int i,a,b,c; /* a百位,b十位,c个位 */
for(i=100; i<1000; i++)
{ a=i/100; b=i/10%10; c=i%10;
if (a*a*a+b*b*b+c*c*c==i)
printf(“%4d”,i);
}
printf(“\n”);
}
*完数(一个数为其因子之和)
#include <stdio.h>
void main( )
{
int i,j,s;
for (i=1; i<1000;i++ )
{
s=0;
for (j=1;j<i;j++)
if ( i%j==0 ) s+=j;
if ( i==s )
{
printf("%d its factors are 1",i);
for ( j=2;j<i;j++)
if (i%j==0) printf(",%4d",j);
printf("\n");
}
}
}
(4)求最大公约数和最小公倍数。
求最大公约数、最小公倍数
#include <iostream.h>
int gys(int m, int n) // 用辗转相除法求最大公约数
{
int d, x ,u ;
d=m>n?m:n;
x=m<n?m:n;
u=d%x;
while(u!=0)
{ d=x; x=u; u=d%x; }
return(x);
}
int gys(int m, int n) // 用辗转相除法求最大公约数的优化算法
{ int r;
while((r=m%n)!=0)
{ m=n; n=r; }
return(n);
}
int gbs(int m, int n) // 求最小公倍数
{
int maxy;
maxy=gys(m,n);
return(m*n/maxy);
}
int gys(int m, int n) // 根据定义求最大公约数
{
int i,x;
x=m<n?m:n;
for(i=x; i>=1; i--)
if(m%i==0 && n%i==0) break;
return(i);
}
int gbs(int m, int n) // 根据定义求最小公倍数
{
int i,d;
d=m>n?m:n;
for(i=d; i<=m*n; i++)
if(i%m==0 && i%n==0) break;
return(i);
}
int gys(int m, int n) // 求最大公约数:大数减小数直至两数相等
{
while(m!=n)
if(m>n)m=m-n;
else n=n-m;
return(m);
}
void main( )
{
int m,n;
scanf("%d%d",&m,&n);
printf("gong yue shu:%4d \n",gys(m,n));
printf("gong bei shu:%4d \n",gbs(m,n));
}三、第七章常用算法总结
(1)数组运算,如找最大,最小值问题,累加和,求平均值;
见函数调用例,非函数调用略,二维数组略。
(2)排序运算,如冒泡法,选择排序;
见函数调用例
(3)字符串操作:strcpy, strcat ,strlen 。
见函数调用例
四、第八章常用算法总结
能以函数的形式完成第五章、第六章、第七章的常用算法。
一、以下程序的功能是:从键盘输入n的值,计算1+1/2+1/3+1/4+…+1/n的值,并将和值返回主调函数,请填空。
#include<stdio.h>
float sum(int n);
{
float i=2;
float s =1.0;
while(i<=n )
{
s =s +1/i;
i++;
}
return (s );
}
main()
{ float m;
float s;
scanf("%f",&m);
s=sum(m);
printf("s=%f\n",s);
}
二、P38 实验五 2 求1!+2!+3!+4!+5!+…
# include <stdio.h>
int jc(int m)
{
int i,w=1;
for (i=1;i<=m;i++)
w=w*i;
return w;
}
main()
{
int i,n,s=0;
scanf("%d",&n);
for ( i=1;i<=n;i++ )
s=s+jc(i);
printf("s=%d \n",s);
}
三、求素数判断 x 是否是素数,若是素数,返回1;若不是素数,返回0。
# include <math.h>
int prime1(int x) /* 解1 */
{
int k, i;
k=sqrt(x);
for(i=2; i<=k; i++)
if(x%i==0) break;
if(i==k+1) return(1);
else return(0);
}
int prime2(int x) /* 解2 */
{
int k, i;
k=sqrt(x);
for(i=2; i<=k; i++)
if(x%i==0) return(0);
return(1);
}
main()
{
int i,m;
scanf("%d",&m);
if (prime(m)==1) printf("%d is a prime . \n",m);
else printf("%d is not a prime. \n",m);
}
四、打印出所有的“水仙花数”。
int hs( int m )
{
int a,b,c; /* a百位,b十位,c个位 */
a=m/100; b=m/10%10; c=m%10;
if (a*a*a+b*b*b+c*c*c==m) return 1;
else return 0;
}
#include <stdio.h>
void main( )
{
int i,a,b,c; /* a百位,b十位,c个位 */
for (i=100; i<1000; i++)
if (hs(i)) printf("%4d",i);
printf("\n");
}
五、完数
#include <stdio.h>
int ws(int m)
{
int i,s=0;
for (i=1;i<m;i++)
if ( m%i==0 ) s+=i;
if (s==m) return 1;
else return 0;
}
void main( )
{
int i,j,s;
for (i=1; i<1000;i++ )
{
if ( ws(i)==1 )
{
printf("%d its factors are 1",i);
for ( j=2;j<i;j++)
if (i%j==0) printf(",%4d",j);
printf("\n");
}
}
}
六、最大公约数和最小公倍数略
七、求一维数组最大、最小、平均值
解1:通过全局变量返回数组的最大值和最小值,通过函数的返回值返回数组的平均值。
#include <stdio.h>
float max, min;
float average(float array[ ], int n)
{ int i; float aver, sum;
max=min=sum=array[0];
for (i=1; i<n; i++)
{ if (array[i]>max) max=array[i];
else if (array[i]<min) min=array[i];
sum=sum+array[i];
}
aver=sum/n;
return(aver);
}
void main( )
{ float ave, score[10];
int i;
for (i=0; i<10; i++) scanf("%f",&score[i]);
ave=average(score, 10);
printf("max=%f \n",max);
printf("min =%f \n",min);
printf("average=%f \n",ave);
}
解2:通过指针做函数参数,返回数组的最大值、最小值和平均值。
// 推荐使用此方法
#include <stdio.h>
void average(float array[ ], int n, float *maxp, float *minp, float *averp)
{ int i; float sum;
sum=array[0];
*maxp=*minp=array[0];
for (i=1; i<n; i++)
{ if (array[i]>*maxp) *maxp=array[i];
else if (array[i]<*minp) *minp=array[i];
sum=sum+array[i];
}
*averp=sum/n;
}
void main( )
{
float score[10], max, min, aver ;
int i;
for (i=0; i<10; i++)
scanf("%f",&score[i]);
average(score, 10, &max, &min, &aver);
printf("max=%f \n",max);
printf("min =%f \n",min);
printf("average=%f \n",aver);
}
八、一维数组排序(选择法、冒泡法)
例1:将n个整数按由小到大排列
#include <stdio.h>
void sort(int a[ ],int n) // 选择法排序
{
int i,j,p,t;
for(i=0; i<n-1; i++)
{
p=i;
for(j=i+1; j<n; j++)
if(a[j]<a[p]) p=j;
if(p!=i) {t=a[i]; a[i]=a[p]; a[p]=t;}
}
}
void sort(int a[ ],int n) // 冒泡法排序
{ int i,j,t;
for(i=0; i<n-1; i++)
for(j=0;j<n-1-i;j++)
if(a[j]>a[j+1])
{ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
}
void main( )
{ int i,a[10];
for(i=0;i<10;i++) scanf("%d",&a[i]);
sort(a,10);
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("\n");
}
九、字符串操作(不用系统函数,完成strlen, strcpy, strcat功能)
#include <stdio.h>
int mystrlen(char *p) /* strlen函数功能 */
{
int i,n=0;
while (*p!=0) { n++; p++; }
return n;
}
void main( )
{ char str[10];
gets(str);
printf("%4d \n",mystrlen(str));
}
# include <stdio.h>
void mystrcpy(char *to,char *from)
/* strcpy函数功能 */
{ int i;
for (i=0;from[i]!='\0';i++)
to[i]=from[i];
to[i]='\0';
}
void main( )
{ char str1[10],str2[10];
gets(str2);
mystrcpy(str1,str2);
puts(str1);
}
void mystrcat(char *s1,char *s2)
/* strcat函数功能 */
{ int i=0,j=0;
while (s1[i]!='\0') i++;
while (s2[j]!='\0')
s1[i++]=s2[j++] ;
s1[i]='\0' ;
}
void main( )
{ char str1[20],str2[10];
gets(str1);
gets(str2);
mystrcat(str1,str2);
puts(str1);
}