算法设计与分析

回文字符串算法,不可以判断一串汉字字符串是否是回文。

题目

回文字符串算法,不可以判断一串汉字字符串是否是回文。

参考答案和解析
正确答案:正确
如果没有搜索结果,请直接 联系老师 获取答案。
相似问题和答案

第1题:

如下哪个函数表示返回文本字符串中的字符个数()。

A.substitute

B.match

C.sum

D.len


答案:D

第2题:

请编写函数fun(),该函数的功能是判断字符串是否为回文,若是则函数返回1,主函数中输出YES:否则返回0,主函数中输出NO。回文是指顺读和倒读都一样的字符串。

例如:字符串LEVEL是回文,而字符串123312就不是回文。

注意;部分源程序已存在文件test26_.cpp中。

请勿修改主函数main和其他函数中的任何内容,仅在函数fun的花括号中填写若干语句。

文件test26_2.cpp的内容如下:

include<iostream.h>

include<stdio.h>

define N 80

int fun(char*str)

{

}

void main()

{char s[N];

cout<<"Enter a string:"<<endl;

gets{s);

cout<<"\n\n";

puts(s);

if(fun(s))

cout<<"YES\n";

else

cout<<"NO\n";

}


正确答案:int fun(char*str) {int in=Ofg=1; char*p=str; while(*p) {n++; p++;} for(i=0;in/2;i++) if(str[i]==str[n-1-i]) ; else {fg=O;break;} return fg; }
int fun(char*str) {int i,n=O,fg=1; char*p=str; while(*p) {n++; p++;} for(i=0;in/2;i++) if(str[i]==str[n-1-i]) ; else {fg=O;break;} return fg; } 解析:解答本题的主要思路是:首先要利用循环中指针的移动来求得字符串的长度n,然后用一个for循环依次取得数组中的前半部分元素,用取得的前半部分内的元素逐个与后半部分内的对应位置的元素进行比较,如果相同,不做任何工作,接着取下一个元素,继续比较:如果不相同,可以判断该字符串肯定不是回文,就给标志变量fg赋值0(fg的初始值为1)。最终把fg作为函数的返回值返回(fg值为1表明是回文,fg值为0表明不是回文)。

第3题:

●试题二

阅读下列函数说明和C函数,将应填入(n)处的字句写在答题纸的对应栏内。

【函数2.1说明】

函数palindrome(char s[])的功能是,判断字符串s是否为回文字符串,若是,则返回0,否则返回-1。若一个字符串顺读和倒读都一样时,称该字符串是回文字符串,例如:"LEVEL"是回文字符串,而"LEVAL"不是。

【函数2.1】

int palindrome(char s[])

{char*pi,*pj;

pi=s;pj=s+strlen(s)-1;

while(pi<pj && (1) ){

pi++;pj--;

}

if( (2) )return -1;

else return 0;

}

【函数2.2说明】

函数f(char*str,char del)的功能是:将非空字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。

例如若str的值为"33123333435",del的值为"3",调用此函数后,将输出3个子字符串,分别为"12"、"4"和"5"。

【函数2.2】

void f(char*str,char del)

{int i ,j ,len;

len=strlen(str);

i=0;

while(i<len){

while( (3) )i++;/*忽略连续的标志字符*/

/*寻找从str[i]开始直到标志字符出现的一个子字符串*/

j=i+1;

while(str[j]!=del && str[j]!=′\0′)j++;

(4) =′\0′;/*给找到的字符序列置字符串结束标志*/

printf(″%s\t″,&str[i]);

(5) ;

}

}


正确答案:

●试题二

【答案】(1)*pi==*pj(2)pi<pj或者等价表达式(3)stri==del(4)strj(5)i=j+1

【解析】(1)指针pi从左往右移动,指针pj从右往左移动,每移动一次,判断二者指向的元素是否相等,所以此处应填入判断语句*pi==*pj(2)pi如果能移动到pj右面,说明字符串是回文字符串,否则返回-1,所以此处应填入pi<pj或者其他等价表达式。(3)此处表达式判断当前字符是否等于标志字符del,即填入 stri==del(4)此处表达式为符合要求的字符串置结束标志,此时j已指向最后,所以应填入strj]即可。(5)此处语句是修改i指针进行下一次循环,所以应填入i=j+1

 

第4题:

阅读以下说明和C程序代码,将应填入(n)处的字句写在对应栏内。

【说明】

下面C程序代码的功能是:对于输入的一个正整数n(100≤n<1000),先判断其是否是回文数(正读反读都一样的数)。若不是,则将n与其反序数相加,再判断得到的和数是否为回文数,若还不是,再将该和数与其反序数相加并进行判断,依此类推,直到得到一个回文数为止。例如,278不是回文数,其反序数为872,相加后得到的1150还不是回文数,再将1150与其反序数511相加,得到的1661是回文数。

函数int isPalm(long m)的功能是:将正整数m的各位数字取出存入数组中,然后判断其是否为回文数。若m是回文数则返回1,否则返回0。

【C程序代码】

include <stdio.h>

include <stdlib.h>

int isPalm(long m)

{ /*判断m是否为回文数*/

int i = 0, k = 0;

char str[32];

while (m > 0) { /*从个位数开始逐个取出m的各位数字并存入字符数组str*/

str[k++] =(1)+ '0';

m = m / 10;

}

for(i = 0; i < k/2; i++) /*判断str中的k个数字字符序列是否是回文*/

if ( str[i] != str[(2)] ) return 0;

return 1;

}

int main ( )

{

long n, a, t;

printf("input a positive integer:"); scanf("%ld",&n);

if (n < 100 || n > =1000) return -1 ;

while((3)) { /*n不是回文数时执行循环*/

printf("%ld-> ", n);

for(a = 0, t = n; t > 0; ) { /*计算n的反序数并存入a*/

a =(4)*10 + t % 10; t = t / 10;

} /*end of for*/

n =(5); /*与反序数求和*/

} /*end of while*/

printf ("%id\n",n);

system("pause"); return 0;

}


正确答案:(1) m%10或其等价表示 (2) k-1-i (3) !isPalm(n)或isPalm(n)!=1或isPalm(n)= =0 (4) a (5) n+a
(1) m%10,或其等价表示 (2) k-1-i (3) !isPalm(n),或isPalm(n)!=1,或isPalm(n)= =0 (4) a (5) n+a 解析:本题考查C程序设计的基本能力。
函数isPalm(long m)的功能是判断m是否为回文数,其方法是先将m的各位数字依次取出转换为对应的数字字符保存在数组str中,然后再判断str中的字符序列是否对称。代码如下:
while(m>0){/*从个位数开始逐个取出m的各位数字并存入字符数组str*/
str[k++] = m %10 +'0';
m=m/10;
}
因此,空(1)处应填入“m%10",将数m的个位数字取出。以上while循环结束时,k的值即为m取初始值时的位数。
若需判断str[0]、str[1]、…、str[k-1]中的k个数字字符序列是否对称,则应依次比较str[0]与str[k-1]、str[1]与str[k-2]、…str[k/2-1]与str[k2+1]是否相等,若都相等,则是回文数;若其中有一处不等,则不是回文数。代码如下:
for(i=0;ik/2;i++)
if ( str[i] !=str[(2)] )return 0;
因此,空(2)处应填入“k-1-i”。
根据题目描述,从最初输入的数开始,直到得到一个回文数时结束,因此对于数n,调用函数is Palm(n),根据返回值确定n是否为一个回文数,空(3)处应填入“!isPalm(n)”。
为了求一个数t的反序数,可从其个位数字开始,依次取出其各位数字并进行组合。下面以t=345举例说明通过整除取余“%”、整除“/”取出各位数字并组合出543的过程。
初始时:a=0t=345
下一步:345%10=>5a*10+5=>a=5t/10=345/10=>t=34
下一步:34%10=>4a*10+4=>a=54t/10=34/10=>t=3
下一步:3%10=>3a*10+3=>a=543t/10=3/10=>t=0
因此,可知空(4)处应填入“a”。
最后数n与其反序数a相加得到新的数,继续产生回文数的过程。空(5)处应填入“n+a”。

第5题:

函数check()用来判断字符串s是否是“回文”(顺读和倒读都一样的字符串称为“回文”,如abcba)。若是回文,函数返回值为1;否则返回值为0。请完成此函数的定义。

注意:部分源程序已存在考生文件夹的文件PROC7.cpp中。

请勿修改主函数和其他函数中的任何内容,仅在函数check()的花括号中填写若干语句。

文件PROC7.cpp的内容如下:

//PROC7.cpp

include<iostream>

include<string>

using namespace std;

int check(char*s);

int main()

{

char str[100],*p;

cout<<"Input your string!";

cin>>str;

p=str;

cout<<"The result is:"<<check(p)<<end1;

}

int check(char*s)

{

// * * * * + * * *

}


正确答案:

第6题:

回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)


参考答案:
  将字符串前一半入栈,然后,栈中元素和字符串后一半进行比较。即将第一个出栈元素和后一半串中第一个字符比较,若相等,则再出栈一个元素与后一个字符比较,……,直至栈空,结论为字符序列是回文。在出栈元素与串中字符比较不等时,结论字符序列不是回文。
  [算法描述]
  #define StackSize 100 //假定预分配的栈空间最多为100个元素
  typedef char DataType;//假定栈元素的数据类型为字符
  typedef struct
  {DataType data[StackSize];
  int top;
  }SeqStack;
  int IsHuiwen( char *t)
  {//判断t字符向量是否为回文,若是,返回1,否则返回0
  SeqStack s;
  int i , len;
  char temp;
  InitStack( &s);
  len=strlen(t); //求向量长度
  for ( i=0; i  Push( &s, t[i]);
  while( !EmptyStack( &s))
  {// 每弹出一个字符与相应字符比较
  temp=Pop (&s);
  if( temp!=S[i]) return 0 ;// 不等则返回0
  else i++;
  }
  return 1 ; // 比较完毕均相等则返回 1
  }

第7题:

请补充函数fun(),该函数的功能是判断一个数是否为回文数。当字符串是回文时,函数返回字符申:yes!,否则函数返回字符串:no!,并在主函数中输出。所谓回文即正向与反向的拼写都一样,例如:abcba。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。

试题程序:

include<string.h>

include<stdio.h>

char *fun(char*str)

{

char *p1,*p2;

int i, t=0;

p1=str;p2=str+strlen(str)-1;

for (i=0;【 】;i++)

if(【 】)

{

t=1;

break;

}

if (【 】)

return("yes!");

else

return("no!");

}

main()

{

char str[50];

printf("Input;");

scanf("%s",str);

printf("%s\n",fun(str));

}


正确答案:i=strlen(sb)/2或istrlen(sw)/2 *p1++!=*p2-- t==20
i=strlen(sb)/2或istrlen(sw)/2 *p1++!=*p2-- t==20 解析:第一空:判断回文数就是将第一个字符与最后—个字符比较,第二个字符与倒数第二个字符进行比较,依此类推,直到中间的字符,如果比较的结果都是相同,则这个字符串就是回文数,否则不是。所以比较的次数是strlen(str)/2。第二空:指针p1从第一个字符向后移动,指针p2从最后一个字符向前移动,如果两字符不相同,则说明此字符串不是回文数,将标记变量t置为1。第三空:变量t用来标记此字符串是否为回文数,当t为0时,表示字符串是回文数,当t为1时,表示字符串不是回文数。

第8题:

如下哪个函数可以返回文本字符串所指定的引用()。

A、Column

B、Row

C、Index

D、Indirect


答案:C

第9题:

给定程序中,函数fun的功能是:判断形参s所指字符串是否是”回文”(Palindrome),若是,函数返回值为1;不是,函数返回值为0。”回文”是正读和反读都一样的字符串:不区分大小写字母)。

例如,LEVEL和Level是”回文”,而LEVLEV不是”回文”。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK.1.C中。

不得增行或删行,也不得更改程序的结构!


正确答案:(1)s (2)-- (3)return O
(1)s (2)-- (3)return O 解析:函数fun的功能是:判断形参s所指字符串是否是”回文”,即比较第一个字符和最后一个字符是否相同,第二个字符和倒数第二个字符是否相同,依此类推,可以用循环来实现。

第10题:

写一函数int fun(char *p)判断一字符串是否为回文,是返回1,不是返回0,出错返回-1


正确答案: