C语言-实用算法

递归法转换整数为字符   
  
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);  

发表评论