将字符串中的回文数输出

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

 

posted @ 2017-03-11 12:41  荒唐了年少  阅读(2343)  评论(0编辑  收藏  举报