/* 给定一个字符串(暂时我还无法确定这个是叫做字符 串,还是为储存的变量为 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 请按任意键继续. . . 结论: 在想要看懂一个陌生程序是,可以先从程序的功能出发,自己思考如果此程序 是自己写,需要哪些步骤,可以将需要的步骤看成一个个模块,在单独考虑每 个模块的写法。将自己的与程序对照。另外,当程序中有多个循环控制结构嵌 套使用时,可以将循环的前几步采取试数的方式写出来,在比较其中的共同点 寻找每个循环的用处。 */