/* 給定一個字符串(暫時我還無法確定這個是叫做字符 串,還是為儲存的變量為 char 類型的數組),輸出 所有長度至少為2的回文子串。回文子串即從左往右輸 出和從右往左輸出結果是的字符串。 比如:qweewq都是回文字符串。 */ #include<cstdio> #include<string.h> int main() { char c[505]; int n; scanf("%s",c); n=strlen(c); // strlen()函數作用是統計括號內的字符串中的字符個數。 for(int m=2; m<=n; ++m) // 從 m=2 開始,判定含有 m 個字符的回文子串是否存在。 for(int i=0; i+m<=n; ++i) /* 循環了 n-m+1 次。 舉例說明: 假設一個字符串有 5 個字符,且此時是判定此字符串中是否含有 字符數為 3 的回文子串。則是以 3 為單位,從字符串的首位比較 到末尾那一組,此時就可以得到比較次數為 3=5-3+1。 即 n-m+1 次。 */ { bool flag = 0; // bool類型變量,默認為 false ,且只有 true 和 false 兩種。 // 此處 flag 賦值為 0 或是 1 都可以,但后面的 flag 需要與前面對應。 for(int j=i; j<i+m; ++j) // 循環 m 次。 if(c[j]!=c[i+m-j+i-1]) // 如果使用等號,則后面的判定無效。 /* 當 m=2 循環2次: 當 i=0 時,最開始的一次循環是比較 c[0] 與 c[1], 然后是 c[1] 與 c[0]; 當 i=1 時,最開始的一次循環是比較 c[1] 與 c[2], 然后是 c[2] 與 c[1]; ........... c[a] 與 c[a+1], c[a+1] 與 c[a]; 當 m=3 循環3次: 當 i=0 時,最開始的一次循環是比較 c[0] 與 c[2], 然后是 c[1] 與 c[1]; ........... c[a] 與 c[a+2], c[a+1] 與 c[a+1]; .......... */ { flag = 1; break; } if(!flag) { for(int j=i; j<i+m; ++j) /* 此處循環是為了將已經確定下來的回文子串輸出,且此回文子 串中含有 m 個字符。 */ { printf("%c",c[j]); } printf("\n"); } } return 0; } /* 程序輸出結果為: qwerewqhhddacb hh dd ere werew qwerewq -------------------------------- Process exited after 11.05 seconds with return value 0 請按任意鍵繼續. . . 結論: 在想要看懂一個陌生程序是,可以先從程序的功能出發,自己思考如果此程序 是自己寫,需要哪些步驟,可以將需要的步驟看成一個個模塊,在單獨考慮每 個模塊的寫法。將自己的與程序對照。另外,當程序中有多個循環控制結構嵌 套使用時,可以將循環的前幾步采取試數的方式寫出來,在比較其中的共同點 尋找每個循環的用處。 */