常用代码总结

1:如何保证int char数组 输入时的正确性和安全性?

# include //int char 输入容易出问题 下面的代码可以解决这个问题  
# define N 10  //如果要录入X个字节则 N=X  
int Getchar(char A[],int min,int max);//直到用户输入的字符串长度在[min,max]之间时 函数结束 返回字符串A的长度  
int gainint(int *p,int a,int b);  
int main(){  
    char A[N+1];//最后一位存'\0'  
    int L,min,max;  
    do{
    printf("请输入字符串的长度的最小值[0,%d]:",N);
    gainint(&min,0,N);
    printf("请输入字符串的长度的最大值[%d,%d]:",min,N);
    gainint(&max,min,N);
    printf("请输入字符串[%d,%d]:",min,max);
    Getchar(A,min,max);
    printf("字符串:%s\n",A);
    }while(1);
    return 0;  
}  
int gainint(int *p,int a,int b)//输入int *p直至满足(a,b)输入结束,并返回*p的位数        
{         
    do{        
        *p=a-1;    //此处是为了减少意外情况的发生 虽然那种意外情况不常见  
        scanf("%d",p);        
        while(getchar()!='\n');        
        if(*p>b||*pb||*p  之间时 函数结束 返回字符串A的长度      
{      
    int B,C;    
 do{      
        A[max]=B=C=0;  
        while((A[B++]=getchar())!='\n'&&B

具体网址在:int-char-输入
2:字符串全匹配:

# include  
# define N 100  //如果要录入X个字节则 N=X  
int Getchar(char A[],int min,int max);//直到用户输入的字符串长度在[min,max]之间时 函数结束 返回字符串A的长度  
int BF(char a[],char b[],int c[]);//a为主串 b为次串 c[]存储匹配的下标 函数返回 匹配的个数 
int main(){  
    char A[N+1],B[N+1]; 
    int C[N],L,num,i; 
    do{
    printf("请输入主字符串A[%d,%d]:",1,N);
    L=Getchar(A,1,N);
    printf("请输入次字符串B[%d,%d]:",1,L);
    Getchar(B,1,L);
    num=BF(A,B,C);
    printf("B在A中共%d个,下标:",num);
    for(i=0;i  之间时 函数结束 返回字符串A的长度      
{      
    int B,C;    
 do{      
        A[max]=B=C=0;  
        while((A[B++]=getchar())!='\n'&&B

-----------字符串直接替换

# include 
# define N 101
int BF(char A[],char B[],char C[],char D[])
{//将A[]中的所有B[]换成C[] 所形成的新字符串存到D[]中
    int i=0,j=0,k=0,m=0,n=0;//返回替换的个数
    do{
        if (B[j]&&A[i++]==B[j])j++;
        else
        {
            if(!B[j]&&++n) while(C[m])D[k++]=C[m++];
            else  (i-=j)&&(D[k++]=A[i-1]);
            j=m=0;
        }
    }while(A[i-1]);
    return n;
}
int main()
{
    char A[N],B[N],C[N],D[N];
    gets(A);
    gets(B);
    gets(C);
    printf("替换个数:%d\n新字符串:\n",BF(A,B,C,D));
    puts(D);
}

更多关于字符串匹配的函数和代码链接:字符串替换-C语言

3:埃氏筛法:

常用的:

# include   
# include   
# define N 10000  
char A[N];   
int main()  
{  
    int i,j,Q;  
    for(A[0]=A[1]=1,Q=sqrt(N)+1,i=2;i

保存质数的:

# include   
# include   
int ZHISHU(char S[],int T[]);//调用完此函数后 如果一个数X为质数 则S[X]=0 否则S[X]=1  T存储质数 返回质数的个数
# define N 10000  
char A[N];  
int B[N/10];    
int main(){  
    int i,num;  
    num=ZHISHU(A,B);    
    for(i=0;i

更多内容链接:质数

4:快速排序一维和二维

一:

# include 
# define N 100
void change(int *a,int *b)//交换函数 交换a b的值
{
    int c=*a;
	*a=*b;
	*b=c;
}
void Qsort(int A[],int L,int R)//快速排序 升序 
{
    int i=L,j=R,T=A[L]; //T为基准数
    if(L>R)  return;
    while(i!=j) //当数组左右两边没相遇
    {
		while(A[j]>=T&&i=T&&i

二维:

# include   
# define N 50  
void change(int *a,int *b){//交换函数  
    int c=*a;  
    *a=*b;  
    *b=c;  
}  
void paixu(int A[][N],int left,int right)//快速排序升序  
{  
    int i=left,j=right,temp[2]={A[0][left],A[1][left]};  
    if(left>=right)  return;  
    while(i!=j)  
    {  
        while((A[0][j]>temp[0]||A[0][j]==temp[0]&&A[1][j]>=temp[1])&& i

相关题目:心急的小加C

5:堆--优先队列:

一维《最小堆:

# include   //WEI行 N列的优先队列 
# include 
# include 
# define N 100  
void insert(int Tree[],int X);//向堆中插入值 S[WEI] 
int Delmin(int Tree[]);  //删除最小值-并返回最小值
int tree[N+1];        
int main(){
	int S,i,j;
	srand(time(0));
	printf("随机生成的数字:");
	for(j=0;j以第每一列的第一个数字为基准:\n");
	while(tree[0])
	{
		printf("%d \n",Delmin(tree));
	}
	return 0;
}
void insert(int Tree[],int X)    
{    
    int par,i=++Tree[0];  //插入X 后 Tree[0]+1    
    while(i>1)  //直到i不是根节点    
    {    
       par=(i>>1);  //父节点为par    
       if(Tree[par]<=X) break;   //将<=改为>=即改为最大堆了
       Tree[i]=Tree[par]; //否则调整堆 即位置上移    
       i=par;    
    }    
    Tree[i]=X;//插入新节点    
}    
int Delmin(int Tree[])    
{    
   int i=1,root=Tree[1],R,L,X=Tree[Tree[0]--];   
   while((i<<1)<=Tree[0])    
   {    
      L=i<<1;R=L+1;//Left Right 记录左右节点    
      if(R<=Tree[0]&&Tree[R][L]
                L=R;    
      if(Tree[L]>=X) break;         //并且将>=改为<=即为最大堆
      Tree[i]=Tree[L];//否则继续调整堆    
      i=L;    
   }    
   Tree[i]=X;    
   return  root;    
}  

二维堆:

# include   //WEI行 N列的优先队列 
# include 
# include 
# define N 101
# define WEI 2 //如果改为3行的 直接将WEI改为3  
void insert(int Tree[][N],int S[]);//向最小堆中插入值 S[WEI] 
void Delmin(int Tree[][N],int S[]);//删除堆的最小值 将最小值存在S中
int tree[WEI][N];     //初始化只需要将tree[0][0]设为0即可   
int main(){
	int S[WEI],i,j;
	srand(time(0));
	printf("随机生成的数字:");
	for(j=0;j<10;j++)
	{
	  for(i=0;i以第每一列的第一个数字为基准:\n");
	while(tree[0][0]){//tree[0][0]数值=存储的数字组数
		Delmin(tree,S);//每次删除完 tree[0][0]自动--
		for(i=0;i>1)  //直到i不是根节点  
    {  
       par=(i>>1);  //父节点为par  
       if(Tree[0][par]<=S[0]) break;//如果父节点满足堆的特性 则插入当前的位置即可  
       for(j=0;j=S[0] 即为最大堆插入方式
       Tree[j][i]=Tree[j][par]; //否则调整堆 即位置上移  
       i=par;  
    }  
    for(j=0;jTree[0][L]
                L=R;  
      if(Tree[0][L]>=T[0]) break;//并将 Tree[0][L]>=T[0]改为Tree[0][L]<=T[0]即为最大堆的删除代码
       for(j=0;j

堆排序:

# include 
# include 
# include 
# define N 10000000
# define M 5000000
int tree[N];
void Dsort(int *tree,int n);
int main()
{
    int i;
    srand(time(0));
    for(i=0;i1)
        {
            L=(i>>1);
            if(tree[L]>=R) break;
            tree[i]=tree[L];
            i=L;
        }
        tree[i]=R;
    }
    while(n)
    {
        R=tree[n]; tree[n--]=tree[1];
        i=1;  L=2;
        while(L<=n)
        {
            L+=Ltree[L];
            if(tree[L]<=R) break;
            tree[i]=tree[L];
            i=L;     L<<=1;
        }
        tree[i]=R;
    }
}

二维堆排序:

# include 
# include 
# include 
# define M 70
# define N 50
# define U 5
int tree[M][N];
void Dsort(int *tree[],int n);
int main()
{
    int A[M][N],*p[M],i,j;
    srand(time(0));
    for(i=0; i1)
        {
            L=(i>>1);
            for(k=0; k=R[k]) break;
            tree[i]=tree[L];
            i=L;
        }
        tree[i]=R;
    }
    while(n)
    {
        R=tree[n];
        tree[n--]=tree[1];
        i=1;
        L=2;
        while(L<=n)
        {
            if(Ltree[L][k])L++;
            }
            for(k=0; k

 

相关题目:ON-MYgodness  || POJ-2431

6:大数斐波那契:

# include       
# include       
# define M 1000000000/*每一个int存9位*/      
# define size 9290/*第40万个斐波那契需要9290个int的存储空间*/      
# define MAX 400000      
int add(int a[][size],int d);      
int main()      
{      
    int shu[3][size]={0,0,0},num,wei=0,k,t;/*初始化shu[][];*/    
	do{
    while(wei<1||wei>MAX){      
        printf("显示第几个斐波纳挈数?(1--%d):\n",MAX);      
        scanf("%d",&wei);      
        while(getchar()!='\n');      
    }      
    t=num=add(shu,wei);      
    wei=(wei-1)%3;      
    k=printf("%d",shu[wei][num]);  
    shu[wei][num--]=0;
    while(num>0)      
	{
	 printf("%09d",shu[wei][num]);
     shu[wei][num--]=0;
	}      
    printf("\n共%d位\n",(t-1)*9+k);      
    }while(t);
    return 0;    
}      
int add(int a[][size],int b)      
{      
    int i,j,m,k,c[]={0,1,2},index=1;      
    a[0][1]=a[1][1]=1;/*初值为1  1*/      
    for (i=1;i<=b;i++)      
    {      
        for (j=1;j<=index; j++)      
            a[c[2]][j]=a[c[0]][j]+a[c[1]][j];      
        for (k=1;k=M)       
            {      
                a[c[2]][k+1]+=a[c[2]][k]/M;  /* 当前位向前进位 */      
                a[c[2]][k]%=M;             /*当前位进位之后的值 */      
            }       
            while (a[c[2]][index]>=M)      
            {      
                a[c[2]][index+1] = a[c[2]][index]/M;  /* 向最高位进位 */      
                a[c[2]][index++]%=M;    /* 进位之后的值,位数+1*/      
            }      
            for(m=0;m<3;m++)      
                c[m]=(c[m]+1)%3;//对c[0--2]循环做加法      
    }       
    return index;      
}

7:大数阶乘:

#include   
#define  SIZE  77200    
# define N 10000   /*每四位进一位 每一个int 存四位*/  
int BigFact(int m,int data[]);//计算m的阶乘  
void main()  
{  
    int data[SIZE] = {0};         /*存储SIZE位数,元素全部初始化为0,data[0]空着 */  
    int index,n=0,k;              /* 数组元素个数,表示阶乘值的位数 */  
	printf("10000!用时约2秒\n20000!用时约5秒\n30000!用时约11秒\n40000!用时约21秒\n50000!用时约37秒\n60000!用

时约52秒\n70000!用时约73秒\n");
	do{  
		do{  
			printf("输入n 求n!(1-70000):");  
			scanf("%d", &n);  
			while(getchar()!='\n');  
		}while(n<1||n>70000);
		printf("%d!=\n", n);  
		n=index = BigFact(n,data);/* 计算阶乘n!,返回阶乘值的位数 */  
		if (index)     /* 检验数组是否溢出,若未溢出,则打印阶乘值 */  
			k=printf("%d",data[index]);  
		data[index--]=0;
		while(index>0)  
		{
			printf("%04d",data[index--]); 
			data[index--]=0;
		} 
		printf("\n位数共%d位\n",(n-1)*4+k);    
	}while(1);
}   
int BigFact(int m, int data[])/*函数功能:计算m!,存于数组data中返回阶乘值的位数*/   
{  
    int i, j, k,index = 1;         /* 数组元素个数,表示阶乘值的位数 */   
    for (data[1]=i=1; i<=m; i++)  /* 初始化,令1!=1  计算阶乘m!*/  
    {  
        for (j=1; j<=index; j++)  
            data[j]=data[j] * i;/*每一位数字都乘以i,模仿乘法计算*/  
        for (k=1; k=N)   /*阶乘值的每位数字应在0~9之内若>=10,则进位*/  
            {  
                data[k+1]+=data[k]/N;  /* 当前位向前进位 */  
                data[k]%=N;  
                /*当前位进位之后的值 */  
            }  
			/* 单独处理最高位,若计算之后的最高位>=10,则位数index加1 */  
			while (data[index] >=N)  
			{  
				data[index+1] = data[index]/N;  /* 向最高位进位 */  
				data[index++]%=N;    /* 进位之后的值 位数index加1 */  
			}  
    }  
    return index;/*返回阶乘值的位数 */  
}  

更多代码内容链接:大数
 

你可能感兴趣的:(C语言数据结构)