日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言每日一题之No.9

發布時間:2025/3/13 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。