数学建模社区-数学中国

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

作者: lynnyan    时间: 2005-4-22 01:27
标题: 回文问题(用c++编写)
<>#include&lt;iostream&gt;
* d( v/ x' W3 C4 e4 }0 u" c: `. f#include&lt;fstream&gt;
$ U( e+ S5 D5 f) Q7 Z2 C9 T) S, ?#include"string.h"; |" D8 g+ U; h% Z& Q
//#include"time.h"
7 Z0 o" T5 L/ z, L2 ]using namespace std;
2 T. u7 C. W* y, Q7 Q5 vifstream in("input.txt");' b2 D  U, i* h9 d  i% c" ]
ofstream out("output.txt");
% }" D5 \* Z; J9 C0 d. Nclass String
  S9 Q& k3 ~  t" k2 _- m, g{7 U  _* x5 n- H! p* h7 c/ O' m* g
public:
2 H6 O3 T5 w6 x  X/ d String(char *s="");2 g) `4 @1 o" R8 I$ W0 X  W
String(const String&amp; s);" m# S5 I# ~7 b& ]3 d
~String() {delete[] str; delete[] pre;}
9 f6 b) V3 X, k, {" D2 C( K String&amp; operator=(const String&amp; s);$ r" x0 {) z4 C, C  E
int length()const {return size-1;}
9 r$ K$ |/ ^: L8 W  O int get();4 f& A% M: s/ Q& d8 a& V* p
String&amp; change(int *p,int n);8 H2 u# z9 s% s. v7 l( D+ N
void get(int *p);
9 Y( A& j: ^. }0 ~) K void display(){out&lt;&lt;str&lt;&lt;endl;}
* b' g& [8 R" T) ^* N( jprivate:' c2 C! ^; [+ j  b! P3 V, i. m
char *str;- O; s$ J- P6 l9 C% k
    int  *pre;0 Y$ \" c3 H/ r9 K, Q6 u
int  size;
7 W( J. f# l2 [( f6 {2 L5 J};</P>
$ k0 ]$ B- _( @8 f7 v<>String::String(char *s)1 m; j4 A. A0 Y
{  {! r; D0 i6 w+ `! K5 O0 N6 a
size=strlen(s)+1;
* G* _) h+ H6 [7 g: |8 F% ?- | str=new char[size];
* K1 O1 V7 F! ^4 } if(str==0)  throw "error";! i) A2 X" z. O7 T8 s7 n  Q
strcpy(str,s);
: M  m; ?. P1 W1 I  |$ K pre=new int[size];
, n& j' t! C$ ` if(pre==0)  throw "error";( t7 L6 @4 V6 p2 o$ q( q- O6 y
}</P>
0 m. Z5 X) y. Z5 Z# `<>String::String(const String&amp;s)
+ s+ J  k* m4 d8 Y- r5 M& \{
% W& p! d6 J* R& _* q size=s.size;$ r8 b; a& W! |; ]  o8 X$ r* h5 j
str=new char[size];- _- ]7 }# {8 R: `8 H
if(str==0) throw "error";
9 U4 r6 c  c1 E strcpy(str,s.str);: t) H- _, S( ~1 b
pre=new int[size];4 c$ q: }$ E9 m2 }
if(pre==0) throw "error";
0 X& N! j4 E0 z}</P>
# m0 a8 |5 C  P6 }) z- A<>String&amp; String:perator=(const String&amp; s)
: c) Q/ ^- j4 x4 o& X{
0 G5 D4 h8 I2 B3 @- J0 Y- x' ` if(s.size!=size)
9 O8 P. U- d% D* t8 P( ` {- _6 A% `# U) [6 d
  delete[] str;/ U+ V$ }) ~* z' q0 w* M9 a( ?
  str=new char[s.size];
* f0 h# ]: t$ O  if(str==0)7 u# s0 u4 `9 G1 p+ T
   throw "error";
% \/ e$ `3 ]% i% x+ R9 T  size=s.size;
9 ~; d( U/ u6 Y  M: X }0 _* K/ S2 j1 V+ z; [/ ?
strcpy(str,s.str);* G6 u/ p. [3 Y: w  D4 h
return *this;
  M) k* ?! H" ~* W! G0 `" \7 m, |8 h}</P>
. u; e0 p  z8 {& M2 Y<>String&amp; String::change(int *p,int n)//将整型数组改成字符串
4 {, v/ H  ]( y  E6 s. p{
' ^1 P1 T1 ]0 i, v0 l4 w5 w int i;
% S+ o$ ?9 A& \, {  \ delete[] str;/ N1 j8 }' `7 i9 F
str=new char[n+1];( H6 C& b3 c/ A6 c
for(i=0;i&lt;n;i++)
1 l# `1 u2 z# e: Z, r/ K  if(p&gt;=0&amp;&amp;p&lt;=9)
( W, E1 ~5 y) J7 k% o. q) l/ M   str=p+48;
3 R! J" _# w  P* D1 r  else+ }8 j$ |* c3 q4 ]8 w
   switch(p)
" h9 d9 j( y& O! E" x7 a+ x   {2 `4 Z8 ?9 V5 M5 W9 M0 u
       case 10: str='A'; break;/ l. A1 w- @) {9 ?- `! j7 N( J& V4 }
    case 11: str='B'; break;( |+ U0 I7 Q  |; Q) S, P' w
    case 12: str='C'; break;
5 C8 H' ], [0 P9 z+ {       case 13: str='D'; break;6 t1 A1 e1 d( G" X/ ]
    case 14: str='E'; break;
8 j  q& ]! y! e. e1 g6 H! D    case 15: str='F'; break;! p$ U, _0 O& K( Q; C
   }8 s8 W" N( g+ i# k2 w
  str[n]='\0';5 T. P8 q; h2 z8 u* s5 T" C
  return *this;$ z9 X. E- F$ F# a, `
}% f" f/ E! ^' x1 M8 L
int String::get()//输入一个字符串
% X  W6 H3 [0 @+ \{1 V" Z; B, }$ c
char tmp[40000];
: [* Q5 t+ t7 [ in&gt;&gt;tmp;
5 L7 X3 {2 ?4 p, N# r" }& q  v delete[] str;1 M, J2 F2 G$ r0 ~) s+ H
size=strlen(tmp)+1;6 o& M3 a, K9 t% J7 _# m* F
str=new char[size];
4 i) P/ [5 N' ]" N if(str==0)
1 T, z* s" X- h9 r/ v  throw "error";4 E' a: E" _  e. p) @
strcpy(str,tmp);
7 B- y" ^* e. W* H return size-1;
2 i- v/ W3 I+ e+ s}</P>
6 T; A  _5 o$ `6 b* g3 Y<>void String::get(int *p)//将字符串改成整型数组+ E  a9 ^+ E9 o3 l2 N1 G5 _
{
4 _& }$ M1 z2 R int i,j;. z3 g, F: s! m1 B1 Y- N) d
for(i=0,j=size-2;j&gt;=0;i++,j--); h4 \! N. o4 s% C
  if(str[j]&gt;='0'&amp;&amp;str[j]&lt;='9')
6 ~5 n' d1 Q9 M9 |      p=str[j]-48;9 I: y, B, J- p' F5 S! r6 g6 s5 [8 |
  else) `, r" ~' W4 p* Z  t4 {$ q
  {" F: E: N  y1 `$ Z$ n% u+ D$ [
   switch(str[j])
' T+ s; z; k, E( P' M3 S   {
! `1 v4 F# e/ e9 Q  l$ r       case 'A': p=10; break;  S5 c9 @7 H/ }/ Z4 S9 H4 T4 K
    case 'B': p=11; break;
' X7 x( W+ |! M$ y3 I    case 'C': p=12; break;6 H9 x, J/ A; P. r. i! F$ H
       case 'D': p=13; break;; J7 @- i4 M+ R9 L/ S) k$ ]' C
    case 'E': p=14; break;: B7 e9 K. b# m0 A
    case 'F': p=15; break;
- t& t$ T$ O7 T8 i- v5 q   }
8 h8 d% Z- z3 z; Z  }
* V( s' n# c& N" O  l}</P>* M! O0 E9 s' \
<>void add(int *p,int &amp;m,int *c,int k)//将一个数同其倒置数相加
6 l3 l1 {2 W, ?{: s. y: c4 ^+ h7 k+ p5 P
int i,j,a=0;
; o6 g. z" Y3 x* ]# r: l    for(j=m-1,i=0;j&gt;=0 &amp;&amp; i&lt;m;j--,i++)
) _  T- x% S9 B: Q& a {
% H' }) I! w6 @- N1 F; M     c=p+p[j]+a;
0 ], S2 t: j( e: N  a=0;
9 a5 B$ u: D& \9 t; f4 _! [( b% e  if(c&gt;=k)* `8 {6 I0 r% e$ P3 K" M0 }
  {, }7 m5 }# q  [9 u- h
   a=c/k;" q2 d0 D; ~: ^4 t' Z
   c=c%k;1 ^7 n" E5 M4 J1 q, n2 s1 Y
  }8 U  h: @% \: E4 w6 `! }
} , w1 Z1 \8 ^3 t" f. f
if(a!=0)8 }& e/ V; @: Q' ]; f; p
{
  l4 z0 M5 N7 {9 }! @  c=a;7 |& x% h* F3 i6 }
  m++;
+ o  f# v$ y7 \3 a  @ }" I, q: b: w7 E* \) E
}</P>/ w4 a( h8 i% z; w4 l+ v
<>bool match(int *a,int n)//判断是否为回文数9 p- ^5 D  c  I% e  T8 e
{
) {0 ]: @8 m# ?, B+ i int i,j,h=0;& k2 M, i) |# h, H
for(i=0,j=n-1;i&lt;=n/2 &amp;&amp; j&gt;=n/2;i++,j--)
& p, W6 Q5 J7 [9 m {  g- K. t$ s2 M/ ]3 O
  if(a==a[j])2 ?" v- ~) |/ C9 G7 X4 s3 h2 X
   continue;) O7 I5 P. z+ C/ r2 A4 J
        h=1;5 d7 c/ Z( J! E2 @' P& e# i2 m, Y
  break;/ |9 A1 f% W1 }; C
}. r0 \# C; C& a  M/ J7 R
if(h==0)3 o# B2 u' ^: F$ x0 A1 @* I% T
  return true;3 Z5 u' |. l7 p/ s/ @
else 3 \3 }' @; B% `" p) E3 ?. \
  return false;: q; b  f2 B" H
}, M- {+ t  {2 |& a
//clock_t start,finish;% H* j) }4 l4 q9 F, h1 T6 G
int main()
' \) E: I! E/ O% q7 I{//start=clock();
; v9 P" e/ U' `' p3 o7 L# m if(in.fail())
; _5 c- O$ E7 A5 b6 S. b {0 x( q6 ^/ z' k9 v  u* `! A/ i( @
  cout&lt;&lt;"the input.txt is not exist!";
8 W4 v$ ]- d+ `3 t) V) a7 h* E8 c  F  exit(1);7 x5 d; |! `" L& A# T
}, H5 O+ Z( ]: p  C
String s,s1;
+ S% l6 d. a2 j# q  @' ~ int n,g,k,*a,*c,m,h=0;
; L  C& A! C" ^    in&gt;&gt;k&gt;&gt;g; $ U: }" a5 z  Q1 R* N* L$ U7 ^- o
    s.get();
- b- K; V$ x4 R+ ?: i) f9 L 9 ?5 y7 ~) c( B
    n=s.length();9 s$ f' J( k6 m
m=n+g+1;
7 W* C* z. n8 m3 T) q  c a=new int[m];
, ^& }* i7 G  H. ^; C8 ]5 M c=new int[m];6 l" u. v" P. a& F) w! y. K1 Y
s.get(a);
* {/ Z# X0 D% X! C- g' k$ y% {* I if(match(a,n))! M# a4 D& O& G2 J( e
{
2 y" d; h+ G& D  out&lt;&lt;0&lt;&lt;endl;
6 s3 t! N  I$ E, b  s.display();
, Q0 D: q! Q2 P' c! w! B  return 1;
3 H/ E1 b/ a: ^$ w. r4 { }; Q+ i7 I7 j# n* E! D7 q: B
do
) `# W9 X% d4 m- \' B$ ^ {3 `, s% Z. T: r0 t0 ]% N+ r
     if(h%2==0)
' ^5 e" E$ U: _$ Q. `. C      add(a,n,c,k);  p# c+ R( p$ f6 z6 x3 s9 B
  else& l( N6 q4 @# j* O" o2 X
   add(c,n,a,k);
, b5 F6 L: M" K, y" z" S8 F  Z  h++;5 a$ g: k1 C' n) y: C& g  E6 h
  if(h&gt;g), ~2 W5 I' @* y! {
   break;
- ?  p' i7 R2 ^5 T }
5 b8 \& L1 Q8 Q4 a3 x5 c+ E" i0 e while(!match(a,n)&amp;&amp;!match(c,n));& i* F1 M0 y  S8 M5 I% @; w
if(h&gt;g)' y; J. n" }8 b; O# d
     out&lt;&lt;"No Solution!"&lt;&lt;endl;/ _: v" M) h2 O/ i1 o
else
- D5 J  v1 e) Z  p5 b {  H, O. S/ _4 e% B0 m
      out&lt;&lt;h&lt;&lt;endl;: G- F% E6 ^1 N3 D! K7 l
     if(h%2==0)
% L) c* X& w  v/ j) ^      s1.change(a,n);
7 H( s: Z3 j8 H% D* \7 s( u6 l     else
+ ?0 y4 z7 G6 b% V2 H% f# F      s1.change(c,n);6 Y$ ?4 W+ ?9 u0 A$ h" L0 i9 m# u
     s1.display();
2 u& ]" [/ H. n- s0 ^8 A. X# t }
5 R( B; Q2 b" X3 C6 u- I delete[] a;9 Y/ S( n6 U9 `) P
delete[] c;8 R& n" I* r5 A
// finish=clock();
0 i6 F( C; \( e: U5 e- I// cout&lt;&lt;finish-start&lt;&lt;endl;
% d6 S1 P+ t" R1 e6 ^1 a return 1;
5 F2 Z) f: ?) X2 i* e4 [5 ?}</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