本篇随笔主要把平时练习的各种算法的小段代码汇集于此,以备日后查看
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; }
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"); } }