“回文”是指正讀反讀都能讀通的句子,它是古今中外都有的一種修辭方式和文字遊戲,如“我為人人,人人為我”等。在數學中也有這樣一類數字有這樣的特徵,成為迴文數(palindrome number)。
設n是一任意自然數。若將n的各位數字反向排列所得自然數n1與n相等,則稱n為一迴文數。例如,若n=1234321,則稱n為一迴文數;但若n=1234567,則n不是迴文數。
注意:
1.偶數個的數字也有迴文數124421
2.小數沒有迴文數
基本介紹
- 中文名:迴文數
- 外文名:palindrome number
- 定義:正讀倒讀都一樣的整數
基本情況
1千以內的迴文數
平方回數
舉例說明
研究現狀
迴文數算法
對迴文數的探索過程

編程實現
JAVA源程式
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);}}用visual basic6.0
用C語言編程
#include<stdio.h>intx,y;separate(int*data,intn){ inti,j; y=0; while(n!=0) { *(data+y)=n%10;n=n/10;y++; } *(data+y)='\0'; for(i=0,j=y-1;i<=j;i++,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);}python源程式
#coding:--utf-8-- #-*-coding:cp936-*-classHws: def__init__(self): self.result=[] defhWs(self): forainrange(1,10000): b=str(a) foriinrange(0,len(b)/2+1): ifb[i]==b[len(b)-i-1]: self.result.append(a) printself.result hws=Hws() hws.hWs()
求最長迴文數長度的manacher算法(O(n))
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<map>#include<iomanip>#defineINF99999999usingnamespacestd;constintMAX=110000+10;chars[MAX*2];intp[MAX*2];intmain(){ while(scanf("%s",s)!=EOF){ intlen=strlen(s),id=0,maxlen=0; for(inti=len;i>=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=2;i<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;}
