两种方式判断一个字符串是不是回文字符串
程序的功能是判断一个字符串是不是回文字符串。判断一个字符串s是否是回文串要求编写递归函数实现,算法思想是:先判断第1个字符和最后1个字符是否相等,若不等,则不是回文串,若相等,则递归的判断由第2个字符~倒数第2个字符构成的串是否是回文串,编写递归函数int huiwen(……)实现判断字符串s是不是回文,是返回1,不是,返回0。主函数中调用该函数,对输入的字符串进行判断,并显示判断的结果。
试验程序:
如果不递归调用可以这样写:
#include
#include
using namespace std;
int huiwen(char a,char b)
{
if(a==b)
return 0;
else
return 1;
}
int main(void)
{
char t[1024];
int len,i,j,k;
cin>>t;
len=strlen(t);
for(i=0,j=len-1;i { k=huiwen(t[i],t[j]); if(k) { cout< return 0; } } cout< return 0 ; } 如果递归的话,可以如下写: #include #include using namespace std; int huiwen2(char *s,int m,int n) { if(m { if(s[m]==s[n]) huiwen2(s,m+1,n-1); else return 1; } else return 0; } int main(void) { char t[1024]; int len; cin>>t; len=strlen(t); if(huiwen2(t,0,len-1)) cout< else cout< return 0 ; } 设线性表A中有n个字符,试设计程序判断字符串是否中心对称,例如xyzyx和xyzzyx都是中心对称的字符串。 #include void push(listack *& s,elemtype e) { listack *p; p=(listack*)malloc(sizeof(listack)); p->data=e; p->next=s->next; s->next=p; } int pop(listack *&s,elemtype &e) { listack *p; if(s->next==NULL) return 0; p=s->next; e=p->data; s->next=p->next; free(p); return 1; } int gettop(listack *s,elemtype &e) { if(s->next==NULL) return 0; e=s->next->data; return 1; } int judge(char *str) { listack *s;elemtype e; initstack(s); char *p=str; while(*p!='#') { push(s,*p); p++; } while(!stackempty(s)) { pop(s,e); if(e!=*str) return 0; str++; } return 1; [转]最长回文子串O(n) 这个算法要解决的就是一个字符串中最长的回文子串有多长。这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文有多长, 这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了。这一点一直是在做回文串问题中时比较烦的地方。这个算法还有一个很好的地方就是充分利用了字符匹配的特殊性,避免了大量不必要的重复匹配。 算法大致过程是这样。先在每两个相邻字符中间插入一个分隔符,当然这个分隔符要在原串中没有出现过。一般可以用‘#’分隔。这样就非常巧妙的将奇数长度回文串与偶数长度回文串统一起来考虑了(见下面的一个例子,回文串长度全为奇数了),然后用一个辅助数组P记录以每个字符为中心的最长回文串的信息。P[id]记录的是以字符str[id]为中心的最长回文串,当以str[id]为第一个字符,这个最长回文串向右延伸了P[id]个字符。 原串:waabwswfd 新串:# w # a # a # b # w # s # w # f # d # 辅助数组P: 1 2 1 2 3 2 1 2 1 2 1 4 1 2 1 2 1 2 1 这里有一个很好的性质,P[id]-1就是该回文子串在原串中的长度(包括‘#’)。 (证明: 1,显然l=2*p【i】-1即为新串中以s【i】为中心的最长回文串长度。 2,以s【i】为中心的回文串定以#开头和结尾,则l-1为原串长度的2 倍 证毕) 好,我们继续。现在的关键问题就在于怎么在O(n)时间复杂度内求出P数组了。只要把这个P数组求出来,最长回文子串就可以直接扫一遍得出来了。 由于这个算法是线性从前往后扫的。那么当我们准备求P[i]的时候,i以前的P[j]我们是已经得到了的。我们用mx记在i之前的回文串中,延伸至最右端的位置。同时用id这个变量记下取得这个最优mx时的id值。(注:为了防止字符比较的时候越界,我在这个加了‘#’的字符串之前还加了另一个特殊字符‘$’,故我的新串下标是从1开始的) 好,到这里,我们可以先贴一份代码了。 复制代码 1. void pk() { int i; int mx = 0; int id; for(i=1; i 实验报告 系部计算机系I班级I I学号I I姓名课程名称—数据结构I实验日期实验名称回文判断成绩 实验目的: 掌握栈的基本操作:入栈、出栈等在链式或顺序存储结构上的实现。 实验条件:PC机一台、VC++6.0编译环境 实验内容与算法思想: 内容: 输入一字符串判断其是否为回文。 算法思想: 1. 算法中主要用到的函数 ①void mai n() //主函数 ②int push_seqstack(Seqstack *s,char x) // 进栈 ③in t pop_seqstack(Seqstack *s) // 出栈 ④int gettop_seqstack(Seqstack *s) 〃取栈顶元素 ⑤int Ishuiwe n( char *s) 〃判断是否是回文 2. 函数之间的调用关系 函数之间的调用关系如图1所示: 图1函数之间的调用关系 运行结果: 运行程序输入一段字符串,运行不同的结果如图2、3所示: 图2 不是回文的判断结果 实验总结: 通过前两次的实验,使我对C语言和数据结构有许多认识。因此,这次实验 在做起来时多少有点思路,但是在实验室当中还是遇到了许多不会的问题,如回文的判断思路、以及函数的调用等等,不过这些问题在老师和同学的帮助下基本完成了这次实验。这次实验让我学到了很多知识,让我对原来所学的又重新复习了一遍,同时还学到了许多其他新知识。 附:源程序: #in clude 2013年通信原理硬件实验报告 学院:信息与通信工程学院 班级:2011211104 姓名: 学号: 班内序号: 组号: 同组人: 目录 实验一:双边带抑制载波调幅(DSB-SC AM) (3) 实验二:具有离散大载波的双边带调幅波(AM) (14) 实验三:调频(FM) (21) 实验六:眼图 (28) 实验七:采样,判决 (31) 实验八:二进制通断键控(OOK) (34) 实验十一:信号星座(选作) (41) 实验十二:低通信号的采样与重建 (45) 实验一双边带抑制载波调幅(DSB-SC AM) 一.实验目的 (1)了解DSB-SC AM信号的产生及相干解调的原理和实现方法。 (2)了解DSB-SC AM的信号波形及振幅频谱的特点,并掌握其测量方法。 (3)了解在发送DSB-SC AM信号加导频分量的条件下,收端用锁相环提取载波的原理及其实现方法。 (4)掌握锁相环的同步带和捕捉带的测量方法,掌握锁相环提取载波的测试方法。 二.实验器材 PC机一台、TIMS实验平台、示波器、导线等。 三.实验原理 1.双边带抑制载波调幅(DSB-SC AM)信号的产生和表达式 图1.1 2.双边带抑制载波调幅信号的解调 基本思路:利用恢复的载波与信号相乘,将频谱搬移到基带,还原出原基带信号。 图1.2 3.DSB-SC AM信号的产生及相干解调原理框图 ()()()()() cos c c c s t m t c t m t A t ω? ==+ 图1.3 四.实验内容及结果 1.DSB-SC AM信号的产生 (1)实验步骤: 图1.4 1.按照上图,将音频振荡器输出的模拟音频信号及主振荡器输出的100KHz模 2.7.1.1 练习1 回文数的猜想 1输入一个数 2一个数,加上是这个数的倒序数,得出结果 3判断是否为回文数,是就退出,否则返回第2步骤 回文数:1336331、9559 典型:输入1735 1753+3571=5324 5324+4235=9559 9559就是一个回文数 程序解答过程: 1设计出各函数功能,便于调用 2编码,解答 各函数功能: 输入数据:int input(void) 对数据取逆序:int reverse(int data) 判断回文数:int ispalin(int data) 溢出判断:int isover(int data //palin.c #include int reverse(int data) { int res=0; for(;data>0;data=data/10)//取得data的的逆序 res=res*10+data%10;//data%10取得data最后一位数字 return res; } int ispalin(int data) { return data==reverse(data); } int isover(int data) { return data<=0||reverse(data)<=0;//当data大小越界,即超过2^31-1,变成负数 } int main() { int data=input(); int i; for(i=0;!isover(data);data+=reverse(data)) { if(!ispalin(data)) printf("[%d]:%d+%d=%d\n",++i,data,reverse(data),data+reverse(data)); else { printf("Palin:%d\n",data); return 0; } } printf("Can not find Palin!\n"); return 0; } 知识:unsigned int:2^32-1 int : 2^31-1 超过了最大值会越界,越界的数会变成负数 北京邮电大学DSP硬件课程实验报告 姓名: 学号: 班级: 院系: 报告提交日期: 目录 一、实验环境——————————————————————3 二、实验一:常用指令实验 (1)简单指令程序运行实验———————————————3 (2)资料存储实验———————————————————5 (3)I/O实验—————————————————————7 (4)定时器实验————————————————————9 (5)I NT2中断实验——————————————————11 三、实验二:A/D采样实验———————————————13 四、实验三:D/A转换实验———————————————14 五、实验四:有限冲击响应滤波器(FIR)算法实验————15 六、实验总结—————————————————————17 七、参考文献—————————————————————17 一、实验环境 实验采用的是理工达盛开发的EL-DSP-II实验教学系统。在实验室电脑上首先进行DSP实验环境的设置。 环境设置的步骤: 1、在计算机BIOS中将驱动方式设为EPP模式; 2、安装开发器epp驱动; 3、安装CCS软件; 具体的环境设置步骤参照实验教材。 二、实验一:常用指令实验 (一)实验目的 1、熟悉DSP开发系统的连接; 2、了解DSP开发系统的组成和结构和应用系统构成; 3、熟悉常用C54X系列指令的用法(程序寻址,寄存器,I/O口,定时器,中断控制)。 (二)实验设备 计算机,CCS 2.0版软件,DSP仿真器,实验箱。 (三)实验操作方法 1、系统连接; 进行DSP实验之前,先必须连接好仿真器、实验箱及计算机,连接方法如下所示: 在硬件安装完成后,接通仿真器电源或启动计算机,此时,仿真盒上的“红色小灯”应点亮,否则DSP开发系统与计算机连接有问题。 2、运行CCS程序; 先实验箱上电,然后启动CCS,此时仿真器上的“绿色小灯”应点亮,并且CCS正常启动,表明系统连接正常;否则仿真器的连接、JTAG接口或CCS相关设置存在问题,掉电,检查仿真器的连接、JTAG接口连接,或检查CCS相关设置是否正确。成功运行程序后,首先应熟悉CCS的用户接口。学会CCS环境下程序编写、调试、编译、装载,学习如何使用观察窗口等。 3、修改样例程序,尝试DSP其他的指令; 4、填写实验报告; 5、样例程序实验操作说明。 (四)实验步骤与内容 1、简单指令程序运行实验 (1)实验使用资源 实验通过实验箱上的XF指示灯观察程序运行结果。 (2)实验过程 (C语言版数据结构)利用栈和队列判断回文 (2010-11-03 11:51:45) 标签: it // File Name: palindrome.h // // Destination:利用栈和队列判断字符串是否是回文 // #ifndef PALINDROME #define PALINDROME #include // 链式队列的基本操作 bool InitQueue(LinkQueue *Q); bool EnQueue(LinkQueue *Q, ElemType e); bool DeQueue(LinkQueue *Q, ElemType *e); // 栈的基本操作 bool InitStack(SqStack *S); bool Push(SqStack *S, ElemType e); bool Pop(SqStack *S, ElemType *e); #endif // File Name: palindrome.cpp // // Destination:利用栈和队列判断字符串是否是回文 #include 《Java语言》课程作业 (第一次) 题目第8题 学院计算机学院专业 班别 学号 姓名陈聪 2015年4月22日 一、课程题目 8、题目:回文素数 回文素数是指一个数同时为素数和回文数。例如:131是一个素数,同时也是一个回文数。数字313和757也是如此。编写程序,显示前100个回文素数,每行显示10个数并且准确对齐,如下所示: 2 3 5 7 11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929 ……. …. …. ………………. [选题人数:3] 二、题目分析与设计 1、题目的需求:编写程序,显示前100个回文素数,每行显示10个数并且准确对齐。 2、制定对应程序的功能: (1)将2以后的素数挑选出来,直到显示完前100个回文素数:利用for循环。 (2)判断挑选出来的素数是否为回文数:通过将原素数倒置再与原素数比较来判断。 (3)输出回文素数,同时判断是否要换行,通过确定位数来使回文素数准确 对齐。 3、(1)程序功能层次图: (2)程序结构流程图:堆栈方式实现字符回文数判断(可运行)
最长回文子串
回文判断教学总结
北邮通原硬件实验报告(DOC)
C语言回文数猜想
DSP硬件实验报告
栈和队列判断回文
Java第一次作业-回文素数