数学建模社区-数学中国

标题: 回文问题(用c++编写) [打印本页]

作者: lynnyan    时间: 2005-4-22 01:27
标题: 回文问题(用c++编写)
<>#include&lt;iostream&gt;
5 g8 u* s# S9 t) `#include&lt;fstream&gt;
; ?3 ?6 R  E9 H1 y#include"string.h"! A- r2 ~! \' K$ }
//#include"time.h"
1 ?, W9 V! u- J1 |2 Jusing namespace std;
. Z" j0 p' G4 T. z2 V" Kifstream in("input.txt");" A3 n  P/ C- E5 p, q+ R
ofstream out("output.txt");
6 J; B" U; g5 t5 B1 `$ O; _* X& tclass String ; [/ Z9 e% ~8 Q
{7 W' L' i4 A! S( k+ Q
public:
! w1 z* L, s5 o1 i String(char *s="");
& W# w# T& Y- K9 Y* l String(const String&amp; s);" ?+ S$ g, ~0 l1 L# N) k. y' R
~String() {delete[] str; delete[] pre;}
% E+ d! h6 B! A4 W0 \" J  q String&amp; operator=(const String&amp; s);
- L* }* [: P! e* ~  d int length()const {return size-1;}
1 a1 H' k/ N& S5 w int get();$ F8 b6 {- N4 t* s, \
String&amp; change(int *p,int n);
6 }6 m' M  n% X7 P" D void get(int *p);# B5 t2 H% f+ ^0 O
void display(){out&lt;&lt;str&lt;&lt;endl;}
3 l( a8 j) K5 I. E" y! zprivate:
! @3 q5 W! r! q8 U& A, i$ n) {* `* y char *str;
" G- _0 y# G6 J( V3 A+ F$ _6 |    int  *pre;/ k+ K6 a2 U! E. l& s' F
int  size;2 u/ j' W, ^# y. u/ C# \
};</P>
( i4 c/ D$ ?; v9 d1 u- U9 A<>String::String(char *s)9 L2 c# t" |! o( R4 X
{7 U" ?' U3 T8 G1 ]# b2 z1 d# P
size=strlen(s)+1;" W0 n: s2 @1 j- Q  M" F
str=new char[size];( J- T( Y& {" b+ {& N$ i& K
if(str==0)  throw "error";
5 |! x! [+ z9 c4 R. S strcpy(str,s);
" f7 i( b) d) N$ {* _" I pre=new int[size];
: ^/ r9 D! w/ W: U& i& {3 K if(pre==0)  throw "error";( T9 Z0 g2 @; Z7 \9 Q
}</P>
- u6 H* S" y( h5 y) V- ~; Z# D; K<>String::String(const String&amp;s)& W% T2 e- e% b4 M9 w
{+ i9 z# y+ O' L3 G; r9 G
size=s.size;
0 |7 L; d( j5 C2 m4 [& D. ~& r str=new char[size];
4 I* Y' k! b+ _. F6 z& Z if(str==0) throw "error";
3 x: X- x8 X/ C9 D strcpy(str,s.str);; u$ `6 r8 ?" q0 k$ X# l
pre=new int[size];
% Y! P9 p, O/ Q% W; z if(pre==0) throw "error";
9 R& I3 a# ^4 S4 V! _8 f}</P>
5 j6 {" M" V5 U) p9 j6 h4 d<>String&amp; String:perator=(const String&amp; s)3 k5 U4 V% D" v6 O
{5 d: ^/ ^( ^3 G: l: T
if(s.size!=size)
6 |3 b$ E+ U* N' x" }. O {6 v4 _8 v- \2 a, ~" |
  delete[] str;
5 K3 w% u- `: @3 r  str=new char[s.size];
5 z7 t, `' a/ X$ ~! w  if(str==0): Z0 }! p+ f' I/ a8 Q3 j
   throw "error";7 E" a" ^) K' N1 M  Q* `
  size=s.size;
3 \3 d2 y9 T5 m+ Z# I }
7 ^6 X% N( U9 {5 H6 J strcpy(str,s.str);
- _  c' m) }8 t& a return *this;! p. q+ X/ y7 Y6 q0 W
}</P>
( D4 D1 y' l2 {" J<>String&amp; String::change(int *p,int n)//将整型数组改成字符串
5 a" E5 ~' M/ t- y  t$ p$ u; T2 O{% K7 y  F0 z/ y% ~' v  c& K, I# ?
int i;
0 _) m" u4 B' y) ~6 S6 e delete[] str;4 {2 P6 S/ @; q6 g
str=new char[n+1];0 s* B5 \/ G# S/ S3 o; i
for(i=0;i&lt;n;i++)
8 w3 Z  \- N6 j3 h0 Y- [  if(p&gt;=0&amp;&amp;p&lt;=9)9 N' y; r6 o" }/ s
   str=p+48;+ k! J3 q5 K- h& r3 x3 V8 M
  else
5 @& `8 H0 Z, l. I7 i4 B   switch(p)
3 ^! z; x' R, a# E  F6 P) D" [   {
6 P3 v# n0 c6 ?$ w       case 10: str='A'; break;
5 y  v' W, R( p! L9 Q    case 11: str='B'; break;
# ^- Q3 i( ]# O    case 12: str='C'; break;
# G: C0 a  B  }1 V       case 13: str='D'; break;# ]% j/ i0 I4 D: V9 N" J# a! {
    case 14: str='E'; break;) e$ \4 z0 ]/ v7 O; F
    case 15: str='F'; break;
  A1 E7 y( A" o0 {6 H   }% M! u# a6 R0 `+ O- x* p3 z" ^
  str[n]='\0';9 J# y& P7 n9 j/ ^
  return *this;
" [2 U# P8 R+ Y/ G7 X- ]7 N}( h& K+ Z% O2 p; Y; w! y) a
int String::get()//输入一个字符串
: C: f+ p+ F6 l( X{' D$ @% n1 Y" n6 u* n: r
char tmp[40000];
" R" {7 d) T5 d" V* F! D2 T# J in&gt;&gt;tmp;3 v2 i) D7 |0 i; K/ O
delete[] str;
( s: z4 n* G& v2 Z8 t  B size=strlen(tmp)+1;
: g7 |* `0 ?3 g: F5 ]$ I2 N$ ~! s str=new char[size];
* U9 ~& z. t  Z' p. b2 }# P1 B7 S if(str==0): ]! f) J" [: R) [1 [9 y
  throw "error";
6 I' I$ u" g9 y strcpy(str,tmp);
! @3 [, b8 M  I3 m# a& [ return size-1;# l% O" p+ F: G8 Y3 {9 D2 g
}</P>3 H# ?' q# W' N- _
<>void String::get(int *p)//将字符串改成整型数组9 T& P* i: ^; x( T. |2 }  @
{
/ l) e' \2 u3 E int i,j;
" \. X5 j9 \$ P/ j# [& R& W for(i=0,j=size-2;j&gt;=0;i++,j--)5 V! A: Z- v' v9 c9 J
  if(str[j]&gt;='0'&amp;&amp;str[j]&lt;='9')" i% q; v% s* L, F
      p=str[j]-48;. b" _! y( S; \$ ]% y& r, K& k9 R
  else% f* ~* Z; f0 ~5 h: n- b: M& ]
  {- Y" o7 X7 b8 f; P
   switch(str[j])
  y+ S. m' U$ Z, w   {1 U* Q# H+ r: X$ N0 Z2 {
       case 'A': p=10; break;6 @+ R- N- H3 w# V' O2 l9 s# Q
    case 'B': p=11; break;4 ~2 q" A# i' ^' t
    case 'C': p=12; break;
; S7 ~: g5 h- b. ]+ ^       case 'D': p=13; break;- P  n2 T& H$ R7 r9 k+ L
    case 'E': p=14; break;" \& @  x8 }% U2 D. T( |% @$ X: W
    case 'F': p=15; break;
( {4 Q/ j2 ]  A5 J% {/ l8 t   }
$ F; e; h+ T( e% f$ v  }- y; ]( J$ C/ t* S. B
}</P>
! {$ Y! F4 \& i4 M9 J<>void add(int *p,int &amp;m,int *c,int k)//将一个数同其倒置数相加9 I+ d3 H& J1 D" O% h( S# y
{4 y, o/ Z2 l5 l& S: @
int i,j,a=0;
9 ]7 d6 s- E. J    for(j=m-1,i=0;j&gt;=0 &amp;&amp; i&lt;m;j--,i++)
; e6 X6 z9 h1 G/ v/ u$ P7 I {
# N# G& N- k4 j- a7 L8 x     c=p+p[j]+a;
8 E0 j( y9 f$ W+ s! r" P  a=0;
) k9 O" x+ x' @2 G7 T  if(c&gt;=k)
: P9 d% J5 |# F6 p! c  {5 A, z0 ~2 f! ~# ]
   a=c/k;
' d0 z7 \: a/ a! }9 s- G   c=c%k;/ m. Z2 @' y, q# V
  }
4 C$ M  M# r- W9 [  g }
2 ^/ p( D+ {, ~1 _8 J% U if(a!=0)" t# s* N- d- d: P! f: R
{1 ^- P* c- V% C
  c=a;, i. ^* U) i2 h0 J8 p$ x' G! a
  m++;: f. t8 p) c$ v3 A. L% v
}8 N$ S$ M, l4 k& y7 j
}</P>
. Y( ?8 `/ Y# W6 {1 R* t' v<>bool match(int *a,int n)//判断是否为回文数
# u7 Q7 b% f: j+ J5 _$ e{! f% Z6 i0 q( R4 _
int i,j,h=0;9 v- e) t0 s" u# I8 p+ H  p
for(i=0,j=n-1;i&lt;=n/2 &amp;&amp; j&gt;=n/2;i++,j--)
9 n$ \) I5 P. f3 j {# a3 P3 K  o2 i' p
  if(a==a[j])# F/ W* e/ b. i6 K1 p9 m6 x
   continue;% x7 n% ]2 B( e* @' Q+ ^
        h=1;5 z7 m& g1 ]9 s4 h) |. C& K: D
  break;
3 f/ }" Z! S5 \1 B7 J }
: f& w1 K$ }  k, A3 J if(h==0)
. d& E, H( A6 W5 T/ `- g8 M  return true;1 s8 ?5 D! S; B- G2 ?3 H5 Q( k
else
7 B6 H9 Y* V4 d0 \. g" B4 k9 A  return false;
/ a( W+ I, J/ ~# X; W, E}
9 n5 x2 K5 Z2 J9 i//clock_t start,finish;% N+ b: Z( g% L/ Z; ?  B& d; E
int main()+ q6 u: g5 N" F
{//start=clock();/ n" J. x' P3 E; v* a
if(in.fail())
9 w0 ]0 w1 x3 y! ?& Z {
9 S0 M" }2 Q7 E+ W; k: T0 a  cout&lt;&lt;"the input.txt is not exist!";
/ w5 H: C0 F  x. M2 ]5 w7 X  exit(1);
3 I3 v3 d0 j) y }
6 r  U# @! }, A; h: b; y String s,s1;& T5 Z# x4 u# ~) `
int n,g,k,*a,*c,m,h=0;
! h) E) S' q2 i/ p" u    in&gt;&gt;k&gt;&gt;g;
' n4 p! T  \% i# @! d5 F    s.get();) p% X2 I4 ?5 F& C& B! g  s# B

. C7 f- n, M; S. p! o' ?8 g    n=s.length();
% }# n# L& C- I- g3 u+ ^; l2 u m=n+g+1;' q+ Y; f2 a0 i8 u. v+ [7 r3 f; e
a=new int[m];& Q$ b2 l+ ^4 ^/ k/ o4 q& h  g
c=new int[m];! p& R0 R% f! J5 E/ X5 W
s.get(a);
! S8 ?$ V3 U$ _ if(match(a,n)). i9 N  ]  A3 S3 D
{
/ ~+ ?+ y( h2 r: c  out&lt;&lt;0&lt;&lt;endl;5 Q% }5 H* ]2 y2 P( B4 J
  s.display();$ |. s3 O3 ^5 V, D
  return 1;6 `6 B0 p9 `- o) z
}
0 A" e7 E2 [/ n5 v& U do$ d! a% w( {& w! R4 H. d  d
{% C: ^. o6 L" n8 b
     if(h%2==0), X; {( ?2 @4 S5 s
      add(a,n,c,k);
7 G) W6 @! T1 N  Q/ E  else
) F' J- P8 B0 v0 Z0 x5 ?$ E   add(c,n,a,k);3 o" }3 [1 O4 v
  h++;; {, D9 z# D9 u' l' _6 M; J- J2 o
  if(h&gt;g)0 m+ o4 E- p9 C7 V( X
   break;
- o( b& p! o; T* X" o8 [; T }
6 ?+ ]% t, O6 d5 p$ Z while(!match(a,n)&amp;&amp;!match(c,n));
# @7 `& q1 s  l if(h&gt;g)" l  t" P' [8 G" X! z6 {
     out&lt;&lt;"No Solution!"&lt;&lt;endl;6 }, b- d2 D: K% ?$ \" K3 J
else! o/ f' n6 o$ p
{
( z2 u7 n1 j! l2 i0 l# N7 |      out&lt;&lt;h&lt;&lt;endl;
  q1 q; P, L# y. s     if(h%2==0)
2 c/ u3 P6 I/ y/ v      s1.change(a,n);
! e/ V6 A! H1 J/ L) ?, C, c# ^& p     else; V- Q3 O  P/ J' y. P5 t
      s1.change(c,n);
: Z; V) v% D; M9 y( o     s1.display();6 x  `8 B/ j# O+ y
}- b; k( B$ u0 Q% K( D2 Z! j) V
delete[] a;8 ~# s. S2 e) N7 M) m+ u
delete[] c;
  G5 f3 V* T; v; z* q// finish=clock();
3 A+ i' s# L2 s. f5 \// cout&lt;&lt;finish-start&lt;&lt;endl;
# ^! ?$ e* y' d( F9 v7 g. S return 1;0 u0 B% s0 B, f' k, N. E
}</P>
作者: txj66    时间: 2005-8-22 02:00
<>谢谢</P>
作者: zxl_lucky    时间: 2005-8-24 17:02
<>谢谢 啊啊 </P>
作者: sabbanji    时间: 2006-11-21 04:52
  一个指针从头向尾走,一个指针从尾向头走,至多走到两个指针相遇或相错,就可以检查出是否为回文了。上面的代码怎么弄得这么复杂?
作者: darkghost    时间: 2006-12-11 01:57
我觉得用堆栈也可以实现吧,先将各元素压栈,然后将其中的元素复制到另外一个栈中,再出栈比较。<br/>呵呵,可能还要麻烦,没做过。。。<br/>
作者: mustpeter    时间: 2006-12-12 16:42
<p>回文是什么意思?</p>
作者: zhuph    时间: 2006-12-26 09:11
有没有汇编写的?
作者: hero1632    时间: 2007-1-2 18:08
<p>不错,正在找</p>
作者: friendfb    时间: 2007-1-6 09:09
<p>设计算法的时候,应该充分考虑时间效率和空间效率!但是两者往往也是互相矛盾的。一个好的算法可以应该权衡这两个方面;或者更加特定的需求来设计算法。</p><p>在我的记忆中,回文是需要考虑标点符号的吧</p><p></p>
作者: zhaoyunfei1126    时间: 2007-4-7 11:50
什么啊???
作者: seashell7    时间: 2007-4-12 17:39
3Q~<br/>~
作者: hanyeyu2009    时间: 2010-12-5 11:01
看看是什么
作者: zengshengda    时间: 2011-1-30 21:52
很强大!!!!!!




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5