c语言,关于回文的程序流程图(要图),设计思想,运行结果都怎么写。很急,很急!

c语言,关于回文的程序流程图(要图),设计思想,运行结果都怎么写。很急,很急!,第1张

3)数字回文

0~9

11~99

101,111,121 。。。。202,212 。。。。

1001,1111,1221 。。。。

偶数位数字的橘空嫌数:

前n/2是n/2 位数,后n/2的每位顺序 为前面n/2 位数字相反

奇数位数字的数,

中间是0~9两边和偶数相同圆手。

4)字符回文

从前向后,从后向前亏禅各取一个字符,直到两个位置相遇,都相等的是回文字符串。

“构造栈;构造队列; 使用栈

和队列进行判断”这个我也不是太懂。

我在网上看到过回文,使用了好多复杂的函数,我都还没学过。

不坦樱过我自己写了一个,你看看,原让宽丛理很简单。

用了.substr函数 for循环 getlin(提取一句话,遇回车终止)

是在C++里写的,不知道在C里能不能用。

<这里在C++的getline(cin,stringname函数有个bug(第一次从键盘getlin输入两个回车才能getlin,但是第二个回车会保存到下一次的getlin)所巧敏以循环getline时会出错>我把循环去掉了。

//*************************************************************

//Palindrome Judgment program 回文判断程序 U6ex4 page235

//cin a sentence,cout its characters in reverse order

//and judgment whether the input line is a palindrome

//*************************************************************

#include<iostream>

#include<string>

using namespace std

string sen

string pal//palindrome回文

int len,i,j//len=length字符串的长度,i是for循环变量,j判断倒序与正序相同字符的个数

//如果它等于字符串总的长度,即为回文。

void main()

{

cout<<"please input a sentence\

"

getline(cin,sen)

cout<<"the reverse order is:\

"

len=sen.length()

j=0//倒序与正序相同字符的个数,赋初值0

for(i=0i<leni++)

{

pal=sen.substr(len-i-1,1)

cout<<pal

if(pal==sen.substr(i,1))

j++

}

if(j==len)

cout<<endl<<"this sentence IS a palindrome\

"

else

cout<<endl<<"this sentence is NOT a palindrome\

"

}

publicclassPlalindrome{publicstaticvoidmain(String[]args){System.out.println(11is+(isPlalindrome(11)?:not)+Plalindromenumber)System.out.println(123is+(isPlalindrome(123)?:not)+Plalindromenumber)System.out.println(17251is+(isPlalindrome(17251)?:not)+Plalindromenumber)System.out.println(2882is+(isPlalindrome(2882)?:not)+Plalindromenumber)}publicstaticbooleanisPlalindrome(intnumber){//此方法实现判断数字是不是回文数Stringnum=String.valueOf(number)returnnewStringBuffer(num).reverse().toString().equalsIgnoreCase(num)}}---------------

11 is Plalindrome number

123 is not Plalindrome number

17251 is not Plalindrome number

2882 is Plalindrome number for i = 100 to 99999 '这里从100开始 后面可以随便填,我这里填99999 表示所有3位数到五位数之间的回文数

if StrReverse(i)=i then print i '用StrReverse函数 判断倒序后的数和原来数是否相同,如果相同者表示此数为颂谨回文数

next #include<stdio.h>intx,yseparate(int*data,intn){    inti,j    y=0    while(n!=0)    {           *(data+y)=n%10n=n/10y++    }    *(data+y)='\0'    for(i=0,j=y-1i<=ji++,j--)    {        if(*(data+i)!=*(data+j)){        printf(%d不是回文!!!\n,x)break        }    }    if(i ==y-1) printf(是回文数)}voidmain(){inta[99]printf(请输入一个正整数:)scanf(%d,&x)separate(a,x)}另外一种实现方法(c++)更简便

#include<iostream>

using namespace std

bool symm(long m)

{

long temp = m,n=0

while (temp)

{

n = n*10+temp%10

temp = temp/10

}

return (m == n)

}

int main(int argc, _TCHAR* argv[])

{

long m

cout<<请输入一个整数:

cin>>m

cout<<输入了<<symm(m)<<个回文数!

return 0

} #include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<map>#include<iomanip>#defineINF99999999usingnamespacestdconstintMAX=110000+10chars[MAX*2]intp[MAX*2]intmain(){    while(scanf(%s,s)!=EOF){        intlen=strlen(s),id=0,maxlen=0        for(inti=leni>=0--i){//插入'#'            s[i+i+2]=s[i]            s[i+i+1]='#'        }//插入了len+1个'#',最终野旁基的s长度是1~len+len+1即2*len+1,首启吵尾s[0]和s[2*len+2]要插入不同的字符        s[0]='*'//s[0]='*',s[len+len+2]='\0',防止在while时p[i]越界        for(inti=2i<2*len+1++i){            if(p[id]+id>i)p[i]=min(p[2*id-i],p[id]+id-i)            elsep[i]=1            while(s[i-p[i]]==s[i+p[i]])++p[i]            if(id+p[id]<i+p[i])id=i            if(maxlen<p[i])maxlen=p[i]        }        cout<<maxlen-1<<endl    }    return0}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12526892.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存