“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number)。
设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。
题目:
“回文串”是一个正读和反读都一样的字符串,比如"level"或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到了两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受哗哗的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
例如:
A=“abc”, B=“b”.有4种把B插入A的方法:
在A的第一个字母之前:即“baba”,判断不是回文
在第一个字母‘a’之后:即“abba”,判断是回文
在字母‘b’之后:即“abba”,判断是回文
在第二个字母‘a’之后:即“abab”,判断不是回文
所以满足条件的答案就是2
剖析:
我的想法是,主要把字符串b整体逐次插入进字符串a的空缺部分并且字符串a,组成新的数组,则我用一个do while循环来始终判断字符串a的那个'\0',来进行循环来对临时数组buff来组成再判断。所以要对字符串a来一个个字符的拆分,我用了strncat函数来对字符串a进行逐个字符链接到新的buff里面。
循环内首先对buff清零
第1步,将字符串b插在字符串a的最前面,则把str_a的前0个字符连接进buff,然后将b连接进buff,最后将str_a剩下的部分连接在buff后面。这里使用了一个指针pstr_a来操作对str_a被分割的后半部分。用变量i来操作对str_a前i位连接进buff的前半部分。则第一步为把str_a的前i = 0位连接进buff,然后将str_b连接进buff,然后将pstr_a++指向的后半部分连接进buff(此时pstr_a指向str_a整体)。然后进行回文判断。
第2步,首先清零buff,因为i++,此时将str_a的前i = 1位字符连接进buff,然后str_b连接进buff,然后将pstr++目前指向的字符串连接进buff(此时pstr_a指向str_a第一个字符后面的所有字符ba).然后进行回文判断。
第3步,首先清零buff,因为i++,此时将str_a的前i = 2位字符连接进buff,然后str_b连接进buff,然后将pstr++目前指向的字符串连接进buff(此时pstr_a指向str_a第二个字符后面的所有字符a).然后进行回文判断。
第4步,首先清零buff,因为i++,此时将str_a的前i = 3位字符连接进buff,然后str_b连接进buff,然后将pstr++目前指向的字符串连接进buff(此时pstr_a指向str_a第三个字符后面的所有字符也就字符‘\0’).然后进行回文判断。
因为pstr_a指向字符‘\0’,while循环不符合,循环结束。
回文判断函数简单,就不详细讲解了。
在循环内每一次进行回文判断成功后,count++来统计是回文字符串的数值,最后打印终端即可。
代码:
#include "stdio.h"
#include "string.h"
//判断回文函数
int Judge_HW(char *str_temp, int len)
{
int i = 0;
for(i = 0; i < (len / 2); i++)
{
if(str_temp[i] == str_temp[len - i - 1])continue;
else return 0;
}
return 1;
}
int main(int argc, char const *argv[])
{
char str_a[128] = {0};
char str_b[128] = {0};
char str_buff[256] = {0};
char *pstr_a = str_a;
unsigned int count = 0;
size_t i = 0;
printf("请输入字符串A:");
scanf("%s",str_a);
printf("请输入字符串B:");
scanf("%s",str_b);
do{
strcpy(str_buff,"\0");//清零buff
strncat(str_buff, str_a, i++);//加入a前半部分
strcat(str_buff, str_b);//插入b
strcat(str_buff, pstr_a);//放入字符串a的后半部分
if(Judge_HW(str_buff, strlen(str_buff)))count++;
}while('\0' != *pstr_a++);
printf("回文数个数为%d个\n",count);
return 0;
}
运行结果: