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


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

    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");
        }
    }
  • 相关阅读:
    mvn 配置修改
    进制换算
    AT指令(中文详解版)二 [转载]
    Linux内核数据包处理流程-数据包接收(3)[转载]
    Linux内核数据包处理流程-数据包接收(2)[转载]
    Linux内核数据包处理流程-数据包接收(1)[转载]
    linux 内核模块 dumpstack
    linux c 用户态调试追踪函数调用堆栈以及定位段错误[转载]
    预处理命令详解(转载)
    [记录]博客开通
  • 原文地址:https://www.cnblogs.com/fbwfbi/p/3356559.html
Copyright © 2020-2023  润新知