该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
循环
1. 小算法
素数
int prime(int x)
{ int i;
for(i=2;i<=x/2;i++)
if(x%i==0) break;
if(i<=x/2) return 0;
else return 1; }
水仙花数
g=x%10; s=x/10%10;b=x/100%10;
逆序数 回文数 数的拆分合成
逆序: int f(int x) { int y=0,f=1;
if(x<0) {f=-1; x=-x;}
while(x){ y=y*10+x%10; x/=10;} return y*f; } 完数 s=1;
for(i=2;i<=x/2;i++) if(x%i==0) s+=i; return s;
最大公约数和最小公倍数
void fun(intm,intn,int *pgy,int *pgb) { int r;
*pgb=m*n;
while((r=m%n)!=0)
{ m=n; n=r;}
*pgy=n; *pgb=*pgb/*pgy;
}
一维数组算法
最值-注意初值
intfmax(int a[],int n)
{ inti,mi=0;
for(i=0;i
if(a[i]>a[mi]) mi=i;
return mi;
}
逆置
void fun(int a[],int n)
{int *b,i,j;
b=(int *)malloc(n*sizeof(int));
for(i=n-1,j=0;i>=0;i--,j++)
b[j]=a[i];
for(i=0;i
}
void fun2(int a[],int n)
{ int i=0,j=n-1,t;
while(i
i++,j--;}
}
void fun3(int a[],int n)
{ int i=0,t;
for(i=0;i
{t=a[i];a[i]=a[n-1-i];a[n-1-i]=t;}
}
查找
1. 顺序查找
数值型:for(i=0;i
if(a[i]==x) break;
字符串:i=0; while(str[i])
if(str[i]==ch) break;
2. 二分查找
intbin_search
(int a[],int n) { int *pl,*ph,*pm;
pl=a,ph=a+n-1;
while(pl<=ph)
{ pm=pl+(ph-pl)/2;
if(x>*pm) pl=pm+1;
else if(x
else return pm-a;/*返回下标*/
} return -1;
}
插入
1. 在字符串中所有ch字符前插入空格
void insert(char str[],char ch)
{ int i=0,j;
while(str[i])
{ if(str[i]==ch)
{ for(j=strlen(str);j>=i;j--)
str[j+1]=str[j];
str[i]=‘‘; i+=2; } else i++; }
}
2. 按序插入
void insert(int a[],intn,int x)
/*a数组中原有n个递增元素*/ { int i=n-1; while(a[i]>x&&i>=0)
{ a[i+1]=a[i]; i--;}
a[i+1]=x;
}
删除
1. 位置删除
for(i=p+1;i
2.按值删除
int del(char str[])
/*返回删除空格的个数*/
{ int n=0,i=0,j;
while(str[i]!=0)
{ if(str[i]==’’)
{ /* for(j=i+1;str[j];j++)
str[j-1]=str[j];
str[j-1]=0;
*/
for(j=i;str[j];j++)
str[j]=str[j+1];
/*注意,此处不能i自加*/
} else i++;
}
方法二 两套下标
int del(char str[])
/*返回删除空格的个数*/
{ int i=0,j=0,n=0;
while(str[i])
if(str[i]!=’’)
str[j++]=str[i++];
else {i++;n++;}
str[j]=0; return n;
}
排序
1. 交换排序
voidchange_sort(int a[],int n) {inti,j,t;
for(i=0;i
{交换a[i] a[j]}
}
2. 选择排序
voidselect_sort(int a[],int n)
{ inti,j,k,t;
for(i=0;i
{ /* 1.找最小元素下标k*/
k=i;
for(j=i+1;j
if(a[j]
交换最小元素和a[i]*/
if(k!=i){交换a[k] a[i]}
}
}
3. 冒泡排序 /*相邻比较*/
voidbubble_sort(int a[],int n)
{ inti,j,t,noswap;
for(i=0;i
{ noswap=1;
for(j=0;j<=n-2-i;j++)
if(a[j]>a[j+1])
{交换;noswap=0;}
if(noswap) break;
}
}
归并
int fun(int a[],intna,int b[],intnb,int c[])
{ int i=0,j=0,k=0;
while(i
{ if(a[i]
else if(a[i]>b[j]) c[k++]=b[j++];
else { c[k++]=a[i++];j++;}
}
while(i
while(j
returnk;
}
二维数组
上三角 for(i=0;i
for(j=i;j
下三角 for(i=0;i
for(j=0;j<=i;j++)
转置
void fun
(int a[][N]) { inti,j,t;
for(i=0;i
for(j=i;j
{交换 a[i][j] a[j][i]} } 最值
字符串和字符数组
1)strlen(str) 注意和sizeof(str)比较
int length(char *str)
{ int n=0;
while(*str){n++; str++;} return n;
}
int length(char *str)
{ char *ps=str;
while(*ps){ps++;}
returnps-str;
}
2)strcpy(str1,str2)
char *copy(char *s1,char *s2)
{ int i=0;
while(s2[i])
{s1[i]=s2[i];i++;}
s1[i]=0;
return s1;
}
3)strcat(str1,str2)
char *cat(char *s1,char *s2)
{ int i=0,j=0;
/*
先找到
s1中0的位置*/
while(s1[i]) i++;
/*然后再将s2从此处拷贝*/
while(s2[j]) s1[i++]=s2[j++];
s1[i]=0;
return s1;
}
4) strcmp(str1,str2)
intcmp(char *s1,char *s2)
{ int i=0;
while(s1[i]==s2[i]&&s1[i]&&s2[i]) i++;
return s1[i]-s2[i];
}
字符串算法 1.
多个字符串排序
void sort(char a[][20],int n) { inti,j; char t[20]; for(i=0;i
for(j=i+1;j
if(strcmp(a[i],a[j])>0)
{ strcpy(t,a[i]);
strcpy(a[i],a[j]);
strcpy(a[j],t);
}
}
2. 字符串模式匹配
int find(char *s,char *t)
{ inti=0,j=0;
while(s[i]&&t[j])
if(s[i]==t[j]) i++,j++;
else i=i-j+1,j=0;
if(!t[j]) return i-j; 返回下标
else return -1;
}
3.统计单词个数
int count(char *s)
{ int i=0,n=0,flag=1;
while(s[i])
{ if(isalpha(s[i]))
{ if(flag==1) n++,flag=0;}
else flag=1;
i++;
}
return n; }
统计整数的个数
int count(char *s,int *a)
{ int i=0,j=-1,n=0,flag=1;
while(s[i])
{ if(isdigit(s[i]))
{if(flag==1)
{ j++;b[j]=s[i]-‘0’;
flag=0;}
else b[j]=b[j]*10+s[i]-‘0’;}
else flag=1; i++; }
returnj+1; }
main()
{ int a=3,b=4;
swap(&a,&b);
printf(“a=%d,b=%d”,a,b);
}
void swap(int *x,int y)
{ int *t;
t=x,x=y,y=t;}
void swap(int *x,int y)
{ int *t; *t=*x,*x=*y,*y=*t;}错
void swap(int *x,int y)
{ int t;
t=*x,*x=*y,*y=t;}
int sub(int x)
{ if(x==0) return 3;
else return sub(x/10)*2;
}
main()
{ printf(“%d”,sub(123)); }