平时各种小段代码的收集(一)

本篇随笔主要把平时练习的各种算法的小段代码汇集于此,以备日后查看

 

1.Hanoi递归求解

#include "stdio.h"

#include "conio.h"



int cout;



void move(int h,char c,char f)

{

    printf("%d:%c--->%c\n",h,c,f);

    cout++;

}



void hanoi(int n,char x,char y,char z)

{

    if(n==1)

        move(1,x,z);

    else

        {

            hanoi(n-1,x,z,y);

            move(n,x,z);

            hanoi(n-1,y,x,z);

        }

}



int main()

{

    int m;

loop:

    cout=0;

    printf("Input the number of disks:");

    scanf("%d",&m);

    printf("The steps to moving %3d disks:\n",m);

    hanoi(m,'A','B','C');

    printf("the cout is : %d\n",cout);

    char t;

     while(1)

   {

       printf("是否继续(y/n):"); 

           if((t=getche(),printf("\n\n"),t)=='y')

           goto loop;

           if(t=='n')

           break;

   }

}

 

 

2.百度笔试题-最长回文子串

/*

    长度为N(N很大)的字符串,求这个字符串里的最长回文子串。

*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

//第一类“12321”:中间是一个单独的字符

int  FindLongPaliSubstr_Odd(const char A[], int * indexMid)

{

    int i = 0, cnt = 0;//cnt表示前后移动位数

    int MyMax = 0;

    int lenOfA = strlen(A);

    *indexMid = 0;

    for(i = 1; i <= lenOfA - 2; i++)

    {

        cnt = 0;

        while(i - cnt >= 0 && i + cnt <= lenOfA - 1 && A[i - cnt] == A[i + cnt])

        {

            cnt++;

        }

        cnt--;

        //找到较大长度的回文字符串,保存中心字符的位置

        if(MyMax < 2 * cnt + 1)

        {

            MyMax = 2 * cnt + 1;

            *indexMid = i;

        }

    }

    return MyMax;

}

//第二类“12321”:中间是两个相同的字符。

int  FindLongPaliSubstr_Even(const char A[],int * First)

{

    int i = 0, cnt = 0;//cnt表示前后移动位数

    int MyMax = 0;

    int lenOfA = strlen(A);

    *First = 0;//中间两个相同字符的第一个字符位置

    for(i = 0; i <= lenOfA - 2; i++)

    {

        if(A[i] == A[i + 1])

        {

            cnt = 1;

            while(i - cnt >= 0 && (i + 1 + cnt) <= lenOfA - 1 && A[i - cnt] == A[i + 1 + cnt])

            {

                cnt++;

            }

            cnt--;

            //找到较大长度的回文字符串,保存中心第一个字符的位置

            if(MyMax < 2 * cnt + 2)

            {

                MyMax = 2 * cnt + 2;

                *First = i;

            }

        }

    }

    return MyMax;

}



int main(void)

{

    char A[] = "adfadfbadfdg12ddsf12344321fagage";

    int indexMid = 0;

    int First = 0;

    int i = 0;

    //两种类别的最长回文子串的长度

    int MaxOdd = FindLongPaliSubstr_Odd(A, &indexMid);

    int MaxEven = FindLongPaliSubstr_Even(A, &First);



    printf("indexMid = %d\n", indexMid);

    printf("First = %d\n", First);

    //哪类比较大,输出哪一类的回文子串

    if( MaxOdd > MaxEven)

    {

        for(i = indexMid - (MaxOdd - 1) / 2; i <= indexMid + (MaxOdd - 1) / 2; i++)

        {

            putchar(A[i]);

        }

    }

    else

    {

        for(i = First - (MaxEven - 2) / 2; i <= First + 1 + (MaxEven - 2) / 2; i++)

        {

            putchar(A[i]);

        }

    }

    return 0;

}

 

3.查找相同字符串

#include <iostream>



using namespace std;



int same(int num)

{

    int cs=num;

    int sz[20];

    int m=0;

    while(cs!=0)

    {

        sz[m]=cs%10;

        cs=cs/10;

        m++;

    }

     for(int i=0;i<m-3;i++)

          for(int j=i+2;j<m-1;j++)

      {

          if((sz[i]==sz[j])&&(sz[i+1]==sz[j+1])) return 1;

      }

        return 0;

}



int main()

{

    int a,b;

    cout<<"请输入一串数字"<<endl<<"a=";

    cin>>a; 

    b=same(a);

    cout<<(b?"有相同数字串":"没有相同数字串")<<endl;

    return 0; 

}
View Code

 

4.字符串的大数相乘

  

#include<iostream>

using namespace std;



void dacheng(char *a,char *b,int anum,int bnum)

{

    int c[100][100];

    int x,y;

    for(int i=0;i<bnum;i++)

    {   x=b[i]-'0';

        for(int j=0;j<anum;j++)

        {

           y=a[j]-'0';

           c[i][j]=x*y;

        }

    }//被乘数为行代表,固有bnum行,anum列,成功

    

    int t=bnum+anum-1;//表示加了以后的数组长度

    int *d=new int[t];

    memset(d,0,t*4);//对数组D进行赋值为0

    for(int i=0;i<bnum;i++)

    {

      for(int j=0;j<anum;j++)

      {

       d[i+j]+=c[i][j];

      }

    }//将矩阵行与行相加,得到结果存入数组

    

      int *e=new int[t+10];

      memset(e,0,40+4*t);

      for(int i=t-1;i>=0;i--)

      {

         e[t-i]=(e[t-1-i]+d[i])/10;

         e[t-1-i]=(e[t-1-i]+d[i])%10;

       

      }

     

      int qq=t;

      while(1)

      {

          if(e[qq]==0){break;}

          else

          {

             e[qq]=e[qq]%10;

             e[qq+1]=e[qq]/10;

             qq++;

            

          }

      }



     char *f=new char[qq];

      for(int i=qq-1;i>=0;i--)

      {

        f[qq-1-i]=e[i]+'0';

        cout<<f[qq-1-i];

      } 

}



int checknum(char *str)//检查是否为数字字符串 

{

    if(str==NULL||str=='\0')

        return 0;

    while(*str!='\0')

    {

        if(*str<0x30||*str>0x39)

            return 0;

        str++;

    }

    return 1;

}



int main()

{

    char a[100],b[100];

    int anum,bnum;

loop:

    cin>>a;

    if(!checknum(a))

    {

        cout<<"输入有误!"<<endl;

        goto loop; 

    }

loop2:

    cin>>b;

    if(!checknum(b))

    {

        cout<<"输入有误!"<<endl;

        goto loop2; 

    }

    anum=strlen(a);

    bnum=strlen(b);

    dacheng(a,b,anum,bnum);

    //system("pause");

   return 0;

}

 

 

5.双向链表的冒泡排序

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <conio.h>



typedef struct Linknode

{

    int data;

    struct Linknode * prior;

    struct Linknode * next;

}*Link;







void InitList(Link &L, int n)

{

    Link pre;

    L=(Link)malloc(sizeof(Linknode));

    L->prior=NULL;

    L->next=NULL;

    pre=L;

    for(int i=0;i<n;i++)

    {

        Link p=(Link)malloc(sizeof(Linknode));

        pre->next=p;

        p->prior=pre;

        p->next=NULL;

        p->data=rand()%100+10;

        pre=p;

    }

}





void Printlist(Link L)

{

    Link p=L->next;

    for(;p;p=p->next)

    {

        printf("%d\t",p->data);    

    }    

    printf("\n");

}



void Freelist(Link L)

{

    Link p=L;

    for(;p;p=p->next)

    {

        free(p);

    }    

}



void Bubblelist(Link& L)

{

    Link p,q,temp;

    int flag=1;

    if(L->next==NULL)

        return;

    p=L->next;

    q=p->next;

    while(flag)

    {

        flag=0;

        for(;p->next;p=p->next,q=q->next)

        {

            if(p->data>q->data)

            {

                p->next=q->next;

                if(q->next!=NULL)

                    q->next->prior=p;

                p->prior->next=q;

                q->next=p;

                q->prior=p->prior;

                p->prior=q;

                temp=p;

                p=q;

                q=temp;

                flag=1;

            }

        }    

        q=p;

        p=q->prior;

        if(flag){

            for(;q->prior!=L;p=p->prior,q=q->prior)

            {

                    if(p->data>q->data)

                {

                    p->next=q->next;

                    if(q->next!=NULL)

                        q->next->prior=p;

                    p->prior->next=q;

                    q->next=p;

                    q->prior=p->prior;

                    p->prior=q;

                    temp=p;

                    p=q;

                    q=temp;

                    flag=1;

                }

            }

        }

        p=q;

        q=p->next;    

    }

}



int main()

{

    Link L;

    loop:

    srand((unsigned)time(NULL));

    InitList(L,10);

    printf("创建链表如下:\n");

    Printlist(L);

    Bubblelist(L);

    printf("排序后的链表如下:\n");  

    Printlist(L);

    Freelist(L);

    int isCtnu;

    while(1)

    {

        printf("是否继续?(y/n):");

        if((isCtnu=getche())=='y'){

            printf("\n\n"); 

            goto loop;

        }

        else if(isCtnu=='n')

            break;

        printf("\n\n");

    }

}

 

 

你可能感兴趣的:(代码)