C语言每日一题之No.9
? ? ? 再做決定之前,我還是做好自己該做的。我不希望幾年后會悔恨自己為什么在最該努力的時候不愿意吃苦。尊敬的女王陛下,請接題:
一.題目:有已按升序排好順序的字符串a,編寫程序將字符串s中的每個字符按升序的規則插到字符串a中,最后輸出”abdefghjkmnptwy”。
二.思路:既然是已經排好序的,就用二分法查找的思想
? ? ? ? ? ? 將字符串s中的每個字符依次作為key拿來和字符串a做比較并且插入
三.程序
?
1 #include <stdio.h> 2 #include <string.h> 3 4 #define SIZE 50 5 6 void InsertStr(char *s,char *a,int low,int high) 7 { 8 int mid = 0; 9 10 while(*a) 11 { 12 mid = (low+high)/2; 13 14 //當mid位置字符<*a<mid+1位置字符或者mid位置字符等于*a時 15 if((s[mid]<*a) && (s[mid+1]>*a) || s[mid]==*a) 16 { 17 for(int j=mid+1;*(s+j);j++) 18 { 19 s[j] = *a;//把*a插入到字符串s中mid+1的位置 20 s[j+2]=s[j+1];//并且字符串s從mid+2開始的位置全部往后挪一個位置 21 high = high +1;//若每插入一個*a字符,則右區間要加1 22 } 23 } 24 else if(s[mid] >*a) 25 { //若mid位置對應的字符大于*a,則右區間變為mid 26 high = mid; 27 InsertStr(s,a,low,high); 28 } 29 else if(s[mid] <*a) 30 { //若mid位置對應的字符小于*a,則左區間變為mid 31 low = mid; 32 InsertStr(s,a,low,high); 33 34 } 35 36 a++; 37 } 38 39 40 } 41 42 43 int main(void) 44 { 45 char s[SIZE]={0}; 46 char a[SIZE]={0}; 47 48 printf("Please input the s string:\n"); 49 scanf("%s",s); 50 printf("Please input the a string:\n"); 51 scanf("%s",a); 52 53 InsertStr(s,a,0,strlen(s)); 54 printf("%s",s); 55 56 return 0; 57 58 }三.編譯運行
? ?程序出錯
四.分析問題
?? 1.在插入字符串那個if條件語句里,犯了一個錯誤:往后面挪的時候,前面的已經把后面的覆蓋了,比如a[6]=a[5],然后a[7]=a[6],看到沒,這個時候a[6]已經被a[5]覆蓋了,它再往后挪都不是自己原來的值了,所以要從最后面開始挪,這樣才不會被覆蓋。
?? 2.*a可以肯定的是插在s[mid+1]的位置,所以直接s[mid+1]=*a;//把*a插入到字符串s中mid+1的位置就可以了,不然s[mid+1]的值會被*a覆蓋
?? 3.每插入一個字符都需要重新獲取high
五.程序
1 #include <stdio.h> 2 #include <string.h> 3 4 #define SIZE 50 5 6 void InsertStr(char *s,char *a,int low,int high) 7 { 8 int mid = 0; 9 10 while(*a) 11 { 12 13 mid = (low+high)/2; 14 15 //當mid位置字符<*a<mid+1位置字符或者mid位置字符等于*a時 16 if((s[mid]<*a) && (s[mid+1]>*a) || s[mid]==*a) 17 { 18 for(int j=strlen(s)-1;j>=mid+1;j--) 19 { 20 s[j+1]=s[j];//并且字符串s從mid+2開始的位置全部往后挪一個位置 21 } 22 s[mid+1]=*a;//把*a插入到字符串s中mid+1的位置 23 24 } 25 else if(s[mid] >*a) 26 { //若mid位置對應的字符大于*a,則右區間變為mid 27 high = mid; 28 InsertStr(s,a,low,high); 29 } 30 else if(s[mid] <*a) 31 { //若mid位置對應的字符小于*a,則左區間變為mid 32 low = mid; 33 InsertStr(s,a,low,high); 34 35 } 36 37 a++; 38 high =strlen(s);//每個字符串a都要重新獲取s字符串的長度 39 } 40 41 42 } 43 44 45 int main(void) 46 { 47 char s[SIZE]={0}; 48 char a[SIZE]={0}; 49 50 printf("Please input the s string:\n"); 51 scanf("%s",s); 52 printf("Please input the a string:\n"); 53 scanf("%s",a); 54 55 InsertStr(s,a,0,strlen(s)); 56 printf("%s",s); 57 58 return 0; 59 60 }還是無法跳出InsertStr()函數,突然記起來要在函數末尾加一個return
1 a++; 2 high =strlen(s);//每個字符串a都要重新獲取s字符串的長度 3 } 4 5 return; 6 }真的可以跳出來了,但是卻還是有問題,現在這樣的運行結果是
六.到底哪里出了問題呢?
七.給出網上的解答版本
1 #include<stdio.h> 2 #include<string.h> 3 void main() 4 { 5 char a[20]="bdfhjmptwy"; //升序 6 char s[ ]="ganke"; 7 char *p1=a,*p2=s,*p=NULL; 8 while(*p2) 9 { 10 while(*p1) 11 { 12 if(*p2>*p1) p1++; 13 else break;//要有出口!!!! 14 } 15 p=p1;//保存指針的位置!!! 16 while(*p1) p1++; 17 while(p1!=p) 18 { 19 *(p1+1)=*p1; 20 p1--; 21 } 22 *(p1+1)=*p1; 23 *p=*p2; 24 p2++; 25 p1=a;//指針復原很重要!!!! 26 } 27 puts(a); 28 }八.對比
?
? ? 那,鑒于你有這樣的毅力,明天犒勞你一個又紅又脆的蘋果+一盒特侖蘇純牛奶哇~
轉載于:https://www.cnblogs.com/TTTTT/p/3731240.html
總結
以上是生活随笔為你收集整理的C语言每日一题之No.9的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果广告背景音乐大全【转】
- 下一篇: 获取顶级常量、祖先链、私有方法