算法归纳递归法转换整数为字符 void convert(int n) {int t; if((t=n/10)!=0) convert(t); putch(n%10+'0'); } 判断素数 int isPrime(int n) {int i; for(i=2;i<n/2;i++) if(n%i==0) return 0; return 1; } 求闰年 if((year%4==0&year%100!=0)||(year%400)==0) printf("%d is a leap year",year); else printf("%d is not a leap year",year); 求N的阶乘 for(int t=1,i=2;i<=N;i++) t*=i; printf("%d",t); 求m和n最大公约数和最小公倍数 if(a<b) {a=t;a=b;b=t;} r=a%b; while(r) {a=b;b=r;r=a%b;} printf("(a,b)最大公约数%d,(a,b)最小公倍数%d",r,ab/r); 大写字母改小写字母 c1=getchar(); c2=c1+32; printf("%c,%c",c1,c2); 小写字母改大写字母 c1=getchar(); c2=c1-32; printf("%c,%c",c1,c2); 求3个数由小到大的顺序输出 if(a>b) {t=a;a=b;b=t;} if(a>c) {t=a;a=c;c=t;} if(b>c) {t=b;b=c;c=t;} * 若要求由大到小顺序输出,改'>'为'<'即可。 求ax*x+b*x+c方程的解 if(fabs(a)<=1e-6) printf("非二次方程"); else disc=b*b-4*a*c; if(fabs(disc)<=1e-6) printf("有两相等实根:%f\n",-b/(2*a)); else if(fabs(disc)>1e-6) {x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a); printf("有两相异实根:%f和%f\n",x1,x2); } else {realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf("有两共轭复根:\n"); printf("%f+%fi\n",realpart,imagpart); printf("%f-%fi\n",realpart,imagpart); } 求Fibonacci数列 ( f(n)=f(n-1)+f(n-2) ) int f[N]={1,1}; for(i=2;i<N;i++) f[i]=f[i-1]+f[i-2]; printf("%d",f[i]); 迭代法求x=sqrt(a) ( 迭代公式:x(n+1)=(x(n)+a/x(n))/2 绝对误差<0.00001 ) double mysqrt(double x0) {double x1,y; x1=(x0+a/x0)/2.0; if(fabs(x1-x0)>0.00001) y=mysqrt(x1); else y=x1; return(y); } 求方程2*x*x*x-4*x*x+3*x-6的根 (1)牛顿迭代法求方程在1.5附近的根 ( 牛顿迭代公式:x(n+1)=x(n)-f(x(n))/f'(x(n)) 绝对误差<0.001 ) double f(double x0) {double x1,y; x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3); if(fabs(x1-x0)>0.001) y=f(x1); else y=x1; return(y); } (2)二分法求方程在(-10,10)之间的根 ( 绝对误差<0.001 ) /* 子程序部分 */ float f(float x) {return(2*x*x*x-4*x*x+3*x-6);} - - - - - - - /* 主程序部分 */ float m=-10,n=10;r=(m+n)/2; while(f(r)*f(n)) {if(f(r)*f(n)<0) m=r; else n=r; if(fabs(n-m)<0.001) break; r=(m+n)/2; } printf("%f",r); /* r即为根 */ (3)弦截法求根 /* 子程序部分 */ float f(float x) {return(2*x*x*x-4*x*x+3*x-6);} float xpoint(float x1,float x2); {return(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));} float root(float x1,float x2) {int i; float x,y,y1; y1=f(x1); do{ x=xpoint(x1,x2); y=f(x); if(y*y1>0) {y1=y; x1=x;} else x2=x; }while(fabs(y)>=0.0001); return(x); } - - - - - - - /* 主程序部分 */ do{ printf(input x1,x2:\n"); scanf("%f,%f",&x1,&x2); f1=f(x1); f2=f(x2); }while(f1*f2>=0); x=root(x1,x2); printf("一个根为:%f\n",x); 冒泡法排序 (由小到大) int a[N+1]; for(i=1;i<=N;i++) /* 输入N个数 (数组输入功能)* scanf("%d",&a[i]); for(j=1;j<N;j++) /* 排序开始 */ for(i=1;i<=N-j;i++) if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;} for(i=1;i<=N;i++) /* 输出排好的这N个数 (数组输出功能) */ printf("%d",a[i]); 选择法排序 (由小到大) /* 子程序部分 */ void sort(int array[],int n) {int i,j,k,t; for(i=0;i<n-1;i++) {k=i; for(j=i+1;j<n;j++) if(array[j]<array[k]) k=j; t=array[k];array[k]=array[i];array[i]=t; } 插入法排序 int a[N]; /* 省略数组输入(见上:冒泡法)*/ for(i=1;i<N;i++) {m=a[i]; j=i-1; while(j>=0&&m>a[j]) {a[j+1]=a[j]; j--; } a[j]=m; } /* 省略数组输出(见上:冒泡法)*/ 数列中查找一个关键字 (1)折半法 BinarySearch(a,n,x,j) k=0; m=n-1; while(k<=m) { j=(k+m)/2; if(x==a[j]) exit; else if(x<a[j]) m=j-1; else k=j+1; } if(k>m) j=0; printf("%d",j); (2)顺序查找法 int a[N]; /* 省略数组输入(见上:冒泡法)*/ for(i=0;i<N;i++) if(x==a[i]) {printf("找到!序号为:%d\n",--i); break; } if(i==8) printf("没找到!"); (3)快速顺序查找法 int a[N]; /* 省略数组输入(见上:冒泡法)*/ a[N-1]=x; i=0; while(a[i]!=x) i++; if(i<N-1) printf("找到!序号为:%d\n",i); else printf("没找到!"); 汉诺塔(Hanoi)问题 Hanoi(n,X,Y,Z) if(n==1) move(X,1,Z); else { Hanoi(n-1,X,Z,Y); move(X,n,Z); Hanoi(n-1,Y,X,Z); }