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}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)