OnlyOne 2006-4-17 13:21
C语言算法集合
/*****删除有序数组某一元素*****/
#include<stdio.h>
/******************************/
int main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9},i,j,k;
printf("请输入要删除的数子:");
scanf("%d",&k);
for(i=0;i<=9;i++)
{
if(a[i]==k)
{
for(j=i;j<9;j++)
{
a[j]=a[j+1];
}
break;
}
}
if(i==10)
{
printf("无此数子.\n");
return 0;
}
printf("删除后的数子为:");
for(i=0;i<=9;i++)
printf("a[%d]=%d.",i,a[i]);
return 0;
}
/******************************/
/************冒泡法************/
#include<stdio.h>
/******************************/
int main()
{
int a[10],j,i,k;
printf("Please input:");
for(i=0;i<=9;i++) scanf("%d",&a[i]);
for(i=0;i<9;i++)
{
for(j=9;j>i;j--)
{
if(a[j]<a[j-1])
{
k=a[j];
a[j]=a[j-1];
a[j-1]=k;
}
}
}
printf("排列好的一组数子:");
for(i=0;i<=9;i++)
printf("a[%d]=%d.",i,a[i]);
return 0;
}
/******************************/
/************选择法************/
#include<stdio.h>
/******************************/
int main()
{
int a[10],i,j,k,t;
printf("Please input:");
for(i=0;i<=9;i++) scanf("%d",&a[i]);
for(i=0;i<9;i++)
{
k=i;
for(j=9;j>i;j--) if(a[j]<a[k]) k=j;
t=a[i];
a[i]=a[k];
a[k]=t;
}
printf("它们是:");
for(i=0;i<=9;i++)
printf("a[%d]=%d.",i,a[i]);
return 0;
}
/******************************/
/*********添加某一元素*********/
#include<stdio.h>
/******************************/
int main()
{
int a[10],k,i,j;
printf("请输入一组有序数组开始排序:");
for(i=0;i<9;i++) scanf("%d",&a[i]);
printf("Please intput array:");
scanf("%d",&k);
for(i=0;i<9;i++)
if(a[i]>k)
{
for(j=9;j>i;j--)
{
a[j]=a[j-1];
}
a[i]=k;
break;
}
if(i>9) a[i]=k;
printf("新插入的数字排列后为:");
for(i=0;i<=9;i++)
printf("a[%d]=%d.",i,a[i]);
return 0;
}
/******************************/
/********************************/
#include<stdio.h>
/********************************/
int main(void)
{
int f1=1,f2=1,f3,i;
printf("%d,%d,",f1,f2);
for(i=2;i<20;i++)
{
f3=f1+f2;
if(i==19) printf("%d.",f3);
else
printf("%d,",f3);
f1=f2;
f2=f3;
}
return 0;
}
/********************************/
/********************************/
#include<stdio.h>
/********************************/
int main(void)
{
int a[20]={1,1},i;
for(i=2;i<20;i++)
a[i]=a[i-1]+a[i-2];
for(i=0;i<=19;i++)
printf("a[%d]=%d.\n",i,a[i]);
return 0;
}
/********************************/
计算4字节整数的2进制形式1bit的个数,如oneBits(2)=1;oneBits(3)=2
int oneBits(int i)
{
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
i = (i + (i >> 4)) & 0x0f0f0f0f;
i = i + (i >> 8);
i = i + (i >> 16);
i &= 0x3f;
return i;
}
#####双向冒泡法######
#include"stdio.h"
#define N 10
main(void)
{int a[N];
输入10个数;
int i,j,n,t;
for(n=1;n<=N/2;n++)
{for(i=n-1;i<N-n;i++)
if(a[i]>a[i-1])
{交换;}
for(j=N-n-1;j>n-1;j--)
if(a[j]<a[j-1)
{交换;}
}
.....
/**********指针*冒泡法********/
#include<stdio.h>
/****************************/
void sort(int *x,int y);
/****************************/
int main(void)
{
int a[]={3,1,4,5,9,7,8,6,2,0},i;
sort(a,10);
for(i=0;i<=9;i++)
printf("a[%d]=%d. ",i,a[i]);
return 0;
}
/****************************/
void sort(int *x,int y)
{
int i,t,*j;
for(i=1;i<y;i++)
for(j=x+y-1;j>x+i-1;j--)
if(*(j-1)>*j)
{
t=*j;
*j=*(j-1);
*(j-1)=t;
}
}
/****************************/
/*****判断空格和字符数量******/
#include<stdio.h>
/****************************/
int get(int *x,int *y);
/****************************/
int main(void)
{
int x,y;
if(get(&x,&y))
printf("空格:%d个 , 小写字符: %d个\n",x,y);
else
printf("非法文件\n");
return 0;
}
/****************************/
int get(int *x,int *y)
{
int t;
*x=*y=0;
while((t=getchar())!=EOF)
switch(t)
{
case ' ':
case '\t': (*x)++;break;
case '\n':return 1;
default:if(t>='a'&&t<='z') (*y)++;
}
return 0;
}
/****************************/
/********strrev倒置算法*******/
#include<stdio.h>
#include<string.h>
/****************************/
void strrev1(char a[]);
/****************************/
int main(void)
{
char a[60];
int i;
gets(a);
strrev1(a);
printf("%s\n",a);
return 0;
}
/****************************/
void strrev1(char a[])
{
int i,j,n;
char ch;
n=strlen(a);
for(i=0,j=n-1;i<j;i++,j--)
{
ch=a[i];
a[i]=a[j];
a[j]=ch;
}
}
/****************************/
/***********判断月份**********/
#include<stdio.h>
/****************************/
int main(void)
{
char month[][14]={"Illegal Month",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"};
int i;
for(;;)
{
printf("Please input:");
scanf("%d",&i);
printf("%s\n",i>=1&&i<=12 ? month[i]:month[0]);
}
return 0;
}
/****************************/
/*******4x4矩阵转置输出*******/
#include<stdio.h>
/*****************************/
int main(void)
{
int a[4][4],i,j,t;
for(i=0;i<=3;i++)
for(j=0;j<=3;j++)
scanf("%d",&a[i][j]);
for(i=0;i<=3;i++)
{for(j=0;j<=3;j++) printf("%4d",a[i][j]);
printf("\n");
}
for(i=1;i<4;i++)
for(j=0;j<i;j++)
{t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
printf("=================================\n");
for(i=0;i<=3;i++)
{for(j=0;j<=3;j++) printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}
/*****************************/
/************杨辉三角型*************/
#include<stdio.h>
/**********************************/
int main(void)
{
int a[5][5],i,j;
for(i=0;i<5;i++)
{
for(j=0;j<=i;j++)
{
if(j==0||j==i)
a[i][j]=1;
else
a[i][j]=a[i-1][j]+a[i-1][j-1];
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
/**********************************/
/*输入年和本年第几天利用指针计算月份*/
/**********************************/
#include<stdio.h>
/**********************************/
void monthday(int year,int yearday,int *pmonth,int *pday);
/**********************************/
int main(void)
{
int year,yearday,day,month;
printf("Please input:");
scanf("%d%d",&year,&yearday);
monthday(year,yearday,&month,&day);
printf("%d %d %d",year,month,day);
return 0;
}
/**********************************/
void monthday(int year,int yearday,int *pmonth,int *pday)
{
int i,j,q,day_tab[][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
j=((year%4==0&&year%100!=0)||year%400==0);
for(i=0;yearday>(q=*(*(day_tab+j)+i));i++) yearday-=q;
*pmonth=i;
*pday=yearday;
}
/**********************************/
/******输入年月日计算距其多少天******/
#include<stdio.h>
/**********************************/
int day_of_year(int year,int month,int day);
/**********************************/
int main(void)
{
int year,month,day,k;
printf("Please input:");
scanf("%d%d%d",&year,&month,&day);
k=day_of_year(year,month,day);
printf("%d\n",k);
return 0;
}
/**********************************/
int day_of_year(int year,int month,int day)
{
int i,j=0,day_tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
j=((year%4==0&&year%100!=0)||year%400==0);
for(i=1;i<month;i++)
day=day+day_tab[j][i];
return day;
}
/**********************************/
/**********************************/
#include<stdio.h>
/**********************************/
int monthday(int (*day_tab)[13],int year,int month,int day);
/**********************************/
int main(void)
{
int day_tab[][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,28,31,30,31,30,31,31,30,31,30,31}},year,day,month,k;
printf("Please input:");
scanf("%d%d%d",&year,&month,&day);
k=monthday(day_tab,year,month,day);
printf("%d\n",k);
return 0;
}
/**********************************/
int monthday(int (*day_tab)[13],int year,int month,int day)
{
int i,j,l;
l=((year%4==0&&year%100!=0)&&year%400==0);
for(i=1;i<month;i++)
day+=*(*(day_tab+l)+i);
return day;
}
/**********************************/
/*删除一串字符中的一个后并输出*/
#include<iostream.h>
#include<stdio.h>
int main()
{int i,m,j,n;
int a[10]={1,2,3,4,5,6,7,8,9};
cout<<"this number will be passed that you printf "<<endl;
cin>>m; //输入将要被删除的数.
for(i=0;i<=9;i++)
{if //判断输入的数是否太大.
(m>a[i])
cout<<"this number is wrong.";
return 0; //结束这个数字,重新开始.
if(a[i]==m)
{
for(j=i;j<=8;j++)
{
a[j]=a[j+1];
}
}
};
for(n=0;n<=8;n++)
{
cout<<a[n];
};
return 0;}
/*****************上浮下沉***************/
#include<stdio.h>
/****************************************/
void sortr(int a[],int n);
/****************************************/
int main(void)
{
int num,i,a[100];
scanf("%d",&num);
if(num>100)
{
puts("too many number!");
return 1;
}
for(i=0;i<num;i++)
scanf("%d",&a[i]);
sortr(a,num);
for(i=0;i<num;i++)
printf("%d",a[i]);
return 0;
}
/****************************************/
void sortr(int a[],int n)
{
int l,r,k,j,t;
for(l=1,r=n-1,k=n;l<=r;r=k-1)
{
for(j=r;j>=1;j--)
if(a[j-1]>a[j])
{
t=a[j-1];
a[j-1]=a[j];
a[j]=t;
k=j;
}
for(j=l=k+1;j<=r;j++)
if(a[j-1]>a[j])
{
t=a[j-1];
a[j-1]=a[j];
a[j]=t;
k=j;
}
}
}
/****************************************/
/***********指针数组批量排列*************/
#include<stdio.h>
#include<string.h>
/****************************************/
void sortr(char *x[],int y);
/****************************************/
int main(void)
{
char *a[]={"Hello","Good","Thank you","Wool","Mir2"};
int i;
sortr(a,5);
for(i=0;i<5;i++)
printf("%s\n",a[i]);
return 0;
}
/****************************************/
void sortr(char *x[],int y)
{
int i,j;
char *p;
for(i=0;i<y-1;i++)
for(j=y-1;j>i;j--)
if(strcmp(x[j-1],x[j])>0)
{
p=x[j];
x[j]=x[j-1];
x[j-1]=p;
}
}
/****************************************/
/**杨辉三角型指针版+内存分配**/
#include<stdio.h>
/***************************/
#define a 100
/***************************/
int main(void)
{int *x[a],i,j;
for(i=0;i<8;i++)
{x[i]=(int*)malloc(sizeof(int)*(1+i));
for(j=0;j<=i;j++)
{if(j==0||j==i) *(x[i]+j)=1;
else
*(x[i]+j)=*(x[i-1]+j)+*(x[i-1]+(j-1));
printf("%5d",*(*(x+i)+j));
}
printf("\n");
}
return 0;
}
/***************************/
/*********自编strcpy库函数**********/
#include<stdio.h>
/***********************************/
void strcopy(char *str1,char *str2);
/***********************************/
int main(void)
{char *str1,*str2;
printf("Please intput str1 and str2:");
scanf("%s%s",str1,str2);
strcopy(str1,str2);
printf("%s\n%s\n",str1,str2);
return 0;
}
/***********************************/
void strcopy(char *str1,char *str2)
{while((*str1++=*str2++)!='\0');
}
/***********************************/
/*******自编库函数strlen********/
#include<stdio.h>
/*******************************/
int strle(char *str);
/*******************************/
int main(void)
{int n=0;
char *str1;
printf("Please input string:");
scanf("%s",str1);
n=strle(str1);
printf("%d\n",n);
return 0;
}
/*******************************/
int strle(char *str)
{char *i;
for(i=str;*i;i++);
return i-str;
}
/*******************************/
/***********自编库函数strcmp*********/
#include<stdio.h>
/***********************************/
int strcmp1(char *str1,char *str2);
/***********************************/
int main(void)
{char *str1,*str2; int sum;
printf("Please input string1 and string2:");
scanf("%s%s",str1,str2);
sum=strcmp1(str1,str2);
printf("%d\n",sum);
return 0;
}
/***********************************/
int strcmp1(char *str1,char *str2)
{for(;*str1==*str2;str1++,str2++)
if(*str1=='\0') return 0;
return *str1-*str2;
}
/***********************************/
/***********经典字符转数子***********/
#include<stdio.h>
/***********************************/
int main(void)
{
int i,j=0,k=1;
char a[10],*s;
s=a;
printf("Please input:");
scanf("%9s",a);
if(*s=='-')
{
k=-1;
s++;
}
while(*s)
{
i=*s-'0';
j=j*10+i;
s++;
}
printf("%d\n",j*k);
return 0;
}
/***********************************/
短小精悍的闰年判断函数
int isLeap(int y)//y:公元年份
{
return y%(y%100?4:400)==0;
}