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

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

 

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");
    }
}

 

 

posted @ 2013-10-08 09:23  登高行远  阅读(728)  评论(2编辑  收藏  举报