数学建模社区-数学中国

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

作者: lynnyan    时间: 2005-4-22 01:27
标题: 回文问题(用c++编写)
<>#include&lt;iostream&gt;' v& v4 `5 F! e& ~+ M' i. ~3 e
#include&lt;fstream&gt;% `" x/ s6 V% I$ m5 N3 z* C
#include"string.h"
, S' q  R5 Q8 b//#include"time.h"
) b/ i6 _2 \. a0 x% D$ Fusing namespace std;
$ p  m: k- X8 `ifstream in("input.txt");
3 T) s* `9 r3 t/ Dofstream out("output.txt"); . h8 Q/ d- o& J- i7 I
class String # r1 t7 I, @" F' R
{
: z! X. ?* Y! f$ t0 cpublic:
) ^& ]! _6 w, l String(char *s="");* H+ `; U8 f2 q# f' J0 c. u
String(const String&amp; s);
; B, x4 }3 O; s  |" ]( q6 e ~String() {delete[] str; delete[] pre;}. H, p3 [. R# a( W& S
String&amp; operator=(const String&amp; s);. Z% _( f  w0 N# u- j  S6 L8 A0 J
int length()const {return size-1;}
5 U5 n- Z' v' ?; M8 J- H+ F* Y int get();* f' z+ K& Z7 p
String&amp; change(int *p,int n);
/ l% L/ F% u$ D void get(int *p);
1 B, Z, z( `3 c1 i$ r, a* e# ^ void display(){out&lt;&lt;str&lt;&lt;endl;}  X/ x8 Q. X, i/ t9 v1 k
private:: p( a( @+ T& L# o- p6 \3 P
char *str;6 [( `, I0 ?3 k, i' y& t: I
    int  *pre;+ `* `0 V; w6 B* x: Y9 A0 x
int  size;
: w7 A$ q' R" f! j};</P>
+ U. ]' ^7 B9 o! q4 L<>String::String(char *s)! `2 \6 I$ X4 p3 I7 @; F
{& ^$ b! i7 u7 [0 @$ e
size=strlen(s)+1;# r, O8 ^& m2 ^  ^8 I. X8 [% r0 I
str=new char[size];
0 v  [1 d) s* e9 N if(str==0)  throw "error";
4 [4 D5 l# T6 m strcpy(str,s);; f  w, S4 x# p$ E# V6 w
pre=new int[size];
8 K1 |0 L0 L2 _ if(pre==0)  throw "error";
; b3 S( K6 A$ W9 h* {}</P>. J9 S. r' N  x; y
<>String::String(const String&amp;s)
& c% @' ]4 P, m# L# I6 e* ]{
6 b" w, a9 p7 l: F3 O: a: | size=s.size;$ c7 D8 a! e( m4 O# b3 l
str=new char[size];7 {. M5 c2 y, r; N9 `
if(str==0) throw "error";, w% t; Y$ d) Q, c* w3 x
strcpy(str,s.str);0 c$ V# S9 t# e- `7 \, o" N) t
pre=new int[size];0 T' }# R& h- E" B
if(pre==0) throw "error";
6 w4 X$ p' j& j6 d% f0 q& a}</P>& H# L) o( u" S. r' s% E
<>String&amp; String:perator=(const String&amp; s)
4 L& m% w  P' g. g1 v: Y: y4 J{- Q, x% k" j4 O2 v* ^# B, ?3 q
if(s.size!=size)) k4 E8 I; l& [
{' B3 H' ^3 X( a
  delete[] str;$ N  Q6 Z7 \& E: D
  str=new char[s.size];
3 _# U7 t% C& H: d; I  if(str==0)2 u# K7 s* H3 W4 o- R' F4 j
   throw "error";
6 |) m4 S5 V) b  m% G4 W* B  size=s.size;" E  E* F+ M, g6 m) f
}
; |+ w2 O% Z7 \* c. ] strcpy(str,s.str);
  r: ~$ |$ w$ m6 B- @8 C/ M: m return *this;
' E, @, _7 ?' o# R# a& e4 {}</P>
( \9 n2 O" z+ K. @% l<>String&amp; String::change(int *p,int n)//将整型数组改成字符串/ v5 f. M% a6 g  T/ {: G3 }. G
{4 F: \  U+ k) F
int i;
8 [& p. F# p- w5 L$ N: l6 [5 ? delete[] str;
) R  p/ a. |. G8 F% |: h str=new char[n+1];+ p: w: T  X' s) v  e8 e
for(i=0;i&lt;n;i++)* W. J% ^0 \" ~  q
  if(p&gt;=0&amp;&amp;p&lt;=9), W% ]8 G( Q8 t% Z3 ?
   str=p+48;4 O+ ^! i: L9 |1 Y2 `  y. M
  else6 L* `' j, o7 E* f( ~! O
   switch(p). A. \9 n3 M( K; [( u7 K
   {: L/ X' h- ~" m, P1 C+ w8 \0 ?
       case 10: str='A'; break;/ c8 d5 x* V" X% E1 n) C! s
    case 11: str='B'; break;
7 B% ]$ ?5 C- j  }, K    case 12: str='C'; break;
% k8 H. o; N! Y& ~, A: G& d       case 13: str='D'; break;
" b  n0 z  r9 T/ N& l+ P6 ]    case 14: str='E'; break;
/ p6 a- }; K) A( O8 J5 k; w    case 15: str='F'; break;
; L! ?* L! K# C  g+ w0 U5 ~) C   }
' }7 i2 Q3 x$ P# N  str[n]='\0';) x5 r) C- k# x1 P0 H+ m- X: d
  return *this;
1 M& X! j4 d' ]6 ?}# }8 T  A, ^) f$ c; q
int String::get()//输入一个字符串
& a# i5 r! e/ U' ~{4 Y) Z# |( d  M; h: J( C7 p
char tmp[40000];
9 s6 Q" F* n4 j3 e  `! n# l in&gt;&gt;tmp;
, d8 q2 h- S$ m7 f  ` delete[] str;% ?2 u) e! z# e8 O+ o
size=strlen(tmp)+1;/ G8 A$ y- T" l- h6 T9 J. S
str=new char[size];( X! ~5 o2 U# P5 Q
if(str==0)
' @; @9 P) M  S: D+ S  throw "error";4 V% A1 O  T$ n( K
strcpy(str,tmp);- p; f/ @9 y; c9 D1 R5 N0 B6 G. P+ `
return size-1;
: [% s7 A2 b  i3 m5 I- i8 T}</P>
5 i+ g$ E( b: P+ _; U/ Z<>void String::get(int *p)//将字符串改成整型数组
- ?, w3 V+ h8 Q8 @. C* m, R$ P{! J" L1 W4 s; n; ?( ^6 u
int i,j;
1 ~1 s5 ]8 Y9 f! \* h3 @ for(i=0,j=size-2;j&gt;=0;i++,j--)
) i( D* }/ {+ W% }4 i  if(str[j]&gt;='0'&amp;&amp;str[j]&lt;='9')
1 v5 u0 l# ^0 c5 q; S6 ^) m      p=str[j]-48;
$ I0 E) l1 F! e2 T  else
0 J5 G3 r* d+ p7 l3 N" z  u; r  {
* ^4 F4 d6 L1 \   switch(str[j])( h, @7 s! ^: ~+ f: s
   {# F5 W# q3 X% R* ]6 P6 L1 d  J/ D
       case 'A': p=10; break;
$ K* e- B* f, G; l2 U9 p& a    case 'B': p=11; break;
$ B+ h& b6 T% @9 A, q$ P% ?! D7 K    case 'C': p=12; break;6 l  H" O  Y# ]& w' L( x: O
       case 'D': p=13; break;
0 u' C0 t0 `" G/ g    case 'E': p=14; break;- H2 C  F9 y. F1 ]
    case 'F': p=15; break;8 ]/ x8 x( F6 e# p
   }/ |6 o$ G& m/ E! b1 v3 p1 w5 j
  }
0 [3 f3 v2 ?' u2 @5 t}</P>
. n4 i$ }6 b4 v# W, r8 T<>void add(int *p,int &amp;m,int *c,int k)//将一个数同其倒置数相加
5 y; V6 @0 ~, h6 L" ]1 R: B% I{
3 Q" b7 a, r: h9 } int i,j,a=0;
/ J, G0 ]: C( l) |1 e    for(j=m-1,i=0;j&gt;=0 &amp;&amp; i&lt;m;j--,i++)$ ?; x! a6 P" L* \8 N$ C
{' N* a$ A3 x8 Z  u( \5 c# d
     c=p+p[j]+a;
, q0 U) i. n! G4 @& G  a=0;# Z# K7 t6 b3 r- I7 Y
  if(c&gt;=k)8 n! \5 M/ Y/ M
  {( E& x% D: X6 o7 E) r
   a=c/k;
, o6 X- p8 F' o1 {( F/ @   c=c%k;5 p6 [8 @+ {+ I1 n* b
  }
  Q2 I& I5 {" y0 _2 b- u: @ }
8 V4 }2 i4 Y( s9 }$ L if(a!=0)
5 h, F0 @) }" r8 T! ? {  }/ f, K+ a# X" [1 s
  c=a;
% I2 O+ K8 }4 Y/ i0 u, C  m++;7 x4 x! _; ?% i9 J. a
}
  h& d' [& d$ b}</P>
- r" v5 b4 T0 [" z; |' G3 \# z<>bool match(int *a,int n)//判断是否为回文数
" X$ S) r0 v0 h) S; M{
$ H% B" {0 r$ d  \2 { int i,j,h=0;
& H/ D4 Y& @" V/ G3 @ for(i=0,j=n-1;i&lt;=n/2 &amp;&amp; j&gt;=n/2;i++,j--)0 o& \, d, O) g" u  c' \
{& o0 V: c0 J3 l! v9 M1 m
  if(a==a[j])$ ~( ]4 ?; A7 T  I
   continue;1 [% K/ o& s8 v  _. ]; \( s
        h=1;+ G6 S3 E, E9 w; E, z0 `3 M
  break;: z" q( G$ l$ s- G; M  r# v3 T
}
( b+ m- |: K: B if(h==0)
; I/ x* x+ K5 h% i# x) k  return true;# l( F7 p- o: _6 h( I9 L
else
6 |* O# ?$ y# b1 h$ ]. ~  return false;% }; W9 T7 ]! D. x0 R& h# |
}" i* d6 x5 j' N. c- m1 E
//clock_t start,finish;' y! j) G8 Q& G
int main()8 b' j8 d0 U/ p3 G' g3 ?' p3 V) ]
{//start=clock();! z, S- `' o! x+ J
if(in.fail()), p& p: \$ F" ]% L- c! p
{& c1 `# Z1 e4 A3 Z+ A6 J9 Y  U
  cout&lt;&lt;"the input.txt is not exist!";8 E0 Z+ k( M5 E9 X5 x7 K1 J
  exit(1);; U8 P2 L5 W' z  v
}+ \- v( J2 S0 F$ m9 K6 D7 k
String s,s1;
% \+ {/ K, v$ W2 B6 k  a int n,g,k,*a,*c,m,h=0;
4 p8 g2 L; W5 D' b5 Y2 C    in&gt;&gt;k&gt;&gt;g;
7 ~4 \/ R. }6 R# T, K2 C4 A    s.get();$ L5 r( t3 O0 o9 r* j0 g* K/ y
  r5 c2 y" l9 E
    n=s.length();2 X  A+ C% J4 K
m=n+g+1;
$ c3 d1 G. ]* t+ j a=new int[m];
0 z$ x* n  l0 G c=new int[m];# g) W' n$ {0 y) G# b# g
s.get(a);
" h  K4 v' o+ B9 @' }8 V if(match(a,n))- W: W& Z' m( _5 Z* J9 M
{
- S$ f5 ?3 O3 _, ?+ X5 P' ^1 `" U8 r  L  out&lt;&lt;0&lt;&lt;endl;7 g  l* _4 E' b3 ?3 h( M( A
  s.display();
1 y+ h3 `% q" Q5 @2 N  return 1;
! Y- E' S- {8 L }9 a4 E& a* v# W6 P
do
; i( }4 g- x+ F; E {
9 U1 {- F+ M$ C4 w. r/ ?     if(h%2==0)2 i/ o. J! Z2 A% K9 E* V& ^# o, [
      add(a,n,c,k);2 \" R8 ?' _- n* Z
  else
1 p- b/ i% m" z0 [# e5 F   add(c,n,a,k);
0 [% r) z: ~' s' l  u# d' e  h++;
6 y7 _/ |6 o8 V* g% x+ b" K  if(h&gt;g)7 H5 y1 u; h; \8 q5 S
   break;. }" X' s1 h& W" f( F
}
/ A" n( R! ^8 H7 o: x while(!match(a,n)&amp;&amp;!match(c,n));
; N8 g* z2 Y2 C if(h&gt;g)
  d1 u% |* V  }! e     out&lt;&lt;"No Solution!"&lt;&lt;endl;: z( X& n$ Z* P) [' _6 }2 X8 E
else
/ w& t5 S) ?6 K( I2 Z: g2 O) h, V {- O4 ~7 E. C) V6 F
      out&lt;&lt;h&lt;&lt;endl;
3 p- s# [- [7 Q& E4 @. V     if(h%2==0)
/ e6 o  L. j& R* e' {4 U      s1.change(a,n);
) B5 ]0 U5 j! C8 t& J. x3 L     else
" }& I( L, w3 [! z+ ?, g      s1.change(c,n);
9 D* Z9 g5 a4 N: R4 Q2 W3 m4 `     s1.display();( e8 h7 C% t: s/ \
}
+ G4 r7 O% Z8 l$ S# b delete[] a;5 `+ C, N. b9 {% L* i& u1 \1 ]) D# K
delete[] c;
# ^7 B9 u1 W+ n4 I  J0 }( X// finish=clock();
) x( x1 e4 E: {  E4 T// cout&lt;&lt;finish-start&lt;&lt;endl;$ K& u* W* E& `4 J: X; z
return 1;
# e4 r# E9 B# ]( A$ g* o$ f}</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