算法入门经典(第二版)第三章例题一览
1 /* 2 问题 根据键盘的位置向右错一位输出,其中不会出现QAZ等字符 3 解题思路 建立一个字符串常量,注意回车左边为一个',和\存储的时候要写两个\否则编译器不识别 4 */ 5 #include<cstdio> 6 #include<cstring> 7 int main() 8 { 9 char list[]="`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./"; 10 char ch,*p = NULL; 11 while((ch = getchar()) != EOF){ 12 p = strchr(list,ch); 13 if(p != NULL){ 14 printf("%c",*(p-1)); 15 } 16 else 17 printf("%c",ch); 18 } 19 return 0; 20 }
1 #include<cstdio> 2 #include<cstring> 3 #include<map> 4 using namespace std; 5 6 int ishuiwen(char *s); 7 int isjingxiang(char *s); 8 9 int main() 10 { 11 char s[30],h,j; 12 while(scanf("%s",s) != EOF){ 13 h=ishuiwen(s); 14 j=isjingxiang(s); 15 16 if(h){//分清逻辑关系 17 if(j) 18 printf("%s -- is a mirrored palindrome.\n\n",s); 19 else 20 printf("%s -- is a regular palindrome.\n\n",s); 21 } 22 else{ 23 if(j) 24 printf("%s -- is a mirrored string.\n\n",s); 25 else 26 printf("%s -- is not a palindrome.\n\n",s); 27 } 28 } 29 return 0; 30 } 31 32 33 int ishuiwen(char *s){ 34 char str[30]; 35 int len=strlen(s),i,j=0; 36 for(i=len-1;i>=0;i--){ 37 str[j++]=s[i]; 38 } 39 str[j]='\0'; 40 41 if(strcmp(s,str) == 0) 42 return 1; 43 else 44 return 0; 45 } 46 47 int isjingxiang(char *s) 48 { 49 map<char,char> m; 50 m['A']='A'; 51 m['E']='3'; 52 m['H']='H'; 53 m['I']='I'; 54 m['J']='L'; 55 m['L']='J'; 56 57 m['M']='M'; 58 m['O']='O';// O O 59 m['S']='2'; 60 m['T']='T'; 61 m['U']='U'; 62 m['V']='V'; 63 m['W']='W'; 64 m['X']='X'; 65 m['Y']='Y'; 66 67 m['Z']='5'; 68 69 m['1']='1'; 70 m['2']='S'; 71 m['3']='E'; 72 m['5']='Z'; 73 m['8']='8'; 74 75 char str[30]; 76 77 int len=strlen(s),i,j=0; 78 for(i=len-1;i>=0;i--){ 79 str[j++]=s[i]; 80 } 81 str[j]='\0'; 82 83 for(i = 0; i < len; i++){ 84 if(m[ s[i] ] != str[i]) 85 return 0; 86 } 87 return 1; 88 }
1 /* 2 问题 输入n,计算并输出最小生成元 3 解题思路 将1到100000的数字对应的生成元计算出来,查表即可 4 */ 5 #include<cstdio> 6 7 int scy(int n); 8 int m[100100]; 9 int main() 10 { 11 int t,n,i; 12 for(i=1;i<=100000;i++){ 13 m[i]=scy(i); 14 //printf("%d %d\n",i,m[i]); 15 } 16 17 scanf("%d",&t); 18 while( t-- ) 19 { 20 scanf("%d",&n); 21 for(i=1;i<=n;i++){ 22 if(n == m[i]){ 23 printf("%d\n",i); 24 break; 25 } 26 } 27 //printf("i = %d\n",i); 28 if(i == n+1) 29 printf("0\n"); 30 } 31 return 0; 32 } 33 34 int scy(int n) 35 { 36 int x=n,sum=n; 37 while(x){ 38 sum += x%10; 39 x /= 10; 40 } 41 //printf("sum = %d\n",sum); 42 return sum; 43 }
1 /* 2 问题 输入n(n<=1000),和n个数字表示密码串,再输入若干行猜测串,计算并输出有多少个数字位置正确,有多少个数字在两个序列 3 中都出现过但是位置不对。 4 解题思路 模拟,比较两个串,如果对应位置相等a++并标记匹配过,否则拿该数字在整个密码串中寻找,找到b++。 5 */ 6 #include<cstdio> 7 #include<cstring> 8 const int N=1010; 9 10 int myfind(int x,int s[],int n,int book[]); 11 int main() 12 { 13 int n,s1[N],s2[N],book[N],i,a,b,t=1,j,sum; 14 while(scanf("%d",&n) == 1 && n){ 15 printf("Game %d:\n",t++);//PE 4遍,格式问题,放在该次游戏输入数据之前 16 for(i=0;i<n;i++) 17 scanf("%d",&s1[i]); 18 19 while(1){ 20 sum=0; 21 for(i=0;i<n;i++){ 22 scanf("%d",&s2[i]); 23 sum += s2[i]; 24 } 25 if(sum == 0) break; 26 27 memset(book,0,sizeof(int)*N);//标记s1中能与s2对应位置正确的为1 28 a=b=0; 29 for(i=0;i<n;i++){ 30 if(s1[i] == s2[i]){ 31 a++; 32 book[i]=1; 33 s2[i]=-1;//匹配正确的不再寻找 34 } 35 } 36 for(i=0;i<n;i++){ 37 if(s2[i] != -1 && myfind(s2[i],s1,n,book))//没有匹配正确而且能在s1中找到 38 { 39 b++; 40 } 41 } 42 printf(" (%d,%d)\n",a,b); 43 } 44 } 45 return 0; 46 } 47 48 int myfind(int x,int s[],int n,int book[]) 49 { 50 int i; 51 for(i=0;i<n;i++){ 52 if(book[i] == 0 && x == s[i]){//x在s1中没有被匹配过 53 book[i]=1;//被匹配过 54 return 1; 55 } 56 } 57 return 0; 58 }
1 /* 2 问题 输入一个环状序列,输出该环状序列的最小表示 3 解题思路 自己的解法,将原串赋值两遍,找出所有序列存入set集合容器,最后输出首位即可。 4 算法入门经典提供的思路,充分利用模运算,由于长度一定是相等的,所以一位一位比较,小于是更新位置,最后输出即可 5 相比较而言,后者当数据量比较大的时候时间和空间复杂度相对低一点。 6 */ 7 /*set集合容器解法 8 #include<cstdio> 9 #include<cstring> 10 #include<iostream> 11 #include<string> 12 #include<set> 13 using namespace std; 14 15 int main() 16 { 17 int t,i,len,j,k; 18 string s1; 19 set<string> s; 20 21 char str1[110],str2[230],str[110]; 22 scanf("%d", &t); 23 while(t--){ 24 scanf("%s",str1); 25 strcpy(str2,str1); 26 strcat(str2,str1); 27 28 len=strlen(str1); 29 for(i=0;i < len;i++){ 30 31 k=0; 32 for(j=i;j < i+len;j++) 33 str[k++]=str2[j]; 34 str[k] = '\0'; 35 36 s1=str; 37 s.insert(s1); 38 } 39 cout<<(*(s.begin()))<<endl; 40 s.clear(); 41 } 42 return 0; 43 }*/ 44 //算法入门经典标程 45 #include<cstdio> 46 #include<cstring> 47 #include<iostream> 48 #include<string> 49 #include<set> 50 using namespace std; 51 52 int less2(char s[],int p,int ans); 53 int main() 54 { 55 int t,i,len,j,k,ans; 56 57 char str[110]; 58 scanf("%d", &t); 59 while(t--){ 60 scanf("%s",str); 61 len=strlen(str); 62 ans=0; 63 for(i=1;i < len;i++) 64 if( less2(str,i,ans) ) ans=i; 65 for(i=0;i<len;i++) 66 printf("%c",str[(ans+i)%len]); 67 putchar('\n'); 68 } 69 return 0; 70 } 71 int less2(char s[],int p,int ans) 72 { 73 int len=strlen(s); 74 int i; 75 for(i=0;i<len;i++){ 76 if(s[(p+i)%len] != s[(ans+i)%len]) 77 return s[(p+i)%len] < s[(ans+i)%len]; 78 } 79 return 0; 80 }
欢迎交流,共同进步——