QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6458|回复: 12
打印 上一主题 下一主题

回文问题(用c++编写)

[复制链接]
字体大小: 正常 放大
lynnyan        

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>
游客,如果您要查看本帖隐藏内容请回复
#include&lt;iostream&gt;
+ L0 n8 |, x( {/ z: W#include&lt;fstream&gt;& V+ q9 B1 r  J7 p% P
#include"string.h"
) N" q% _$ R3 E* t# |//#include"time.h"
2 s9 y  n! }0 p  u7 k  @using namespace std;
8 g$ P6 ^# Q- [% H) [ifstream in("input.txt");
9 f) i( A; j4 `ofstream out("output.txt");
- |! S7 |" K3 ^! rclass String . X. q2 N5 k5 l3 {" A
{
9 i% v! W; o( l9 ?7 ^/ k& H+ |public:
* h7 d% ~! Z9 R& U7 }& k String(char *s="");
8 m3 T' c+ b3 ^! q* J" l String(const String&amp; s);
8 e* A1 S# D2 h2 U  t) X: y ~String() {delete[] str; delete[] pre;}9 y; @$ q2 L" |* Y- D) D4 R3 U
String&amp; operator=(const String&amp; s);4 S. w/ J( D9 H1 P2 {
int length()const {return size-1;}
, M* Z3 i+ y: f5 Q1 l int get();
9 ?! R, T* z$ ?9 L# I" A* @ String&amp; change(int *p,int n);/ b' j" i" c% A1 i" G
void get(int *p);, o4 x  v& i) x, ]2 T' V, |
void display(){out&lt;&lt;str&lt;&lt;endl;}: A: C/ r* K- x; t/ C7 @
private:" \1 v- L& ?- z4 z' N4 F
char *str;
+ s5 F9 m5 Q5 S' i( \    int  *pre;: f9 X* d1 k* |; V  D
int  size;" w. R0 [$ w& K+ C' B6 p% G5 R) R
};</P>7 N( H7 [5 H8 `% R6 y" q; ?
<>String::String(char *s)
2 x; W9 ^% }, S9 W- G4 j{
& T3 Z6 D" p. A9 t. K4 s$ A size=strlen(s)+1;
- P+ L* w+ [3 X; u. k! | str=new char[size];+ ~8 ?7 ^  q/ ]: R# h3 ]5 T+ I  T
if(str==0)  throw "error";
0 H5 `& m) w( J( ?4 Q9 m6 W strcpy(str,s);
, R: `* Y% K& b: C) V7 M pre=new int[size];
6 ~! Y$ M- t( M& H& Y$ s if(pre==0)  throw "error";
& ~; ]" A& p8 D  s}</P>
7 m/ L' m4 S" n7 o! Y5 g$ h6 `<>String::String(const String&amp;s)
* g( F; ?2 j2 ~1 b{( b/ c2 @# z# w' H
size=s.size;" x' n5 c( Q2 e. P$ W- B
str=new char[size];& L' L& P  P# f% `4 M, j
if(str==0) throw "error";1 ^" R  }1 y9 D2 o9 k
strcpy(str,s.str);
. b0 H9 D/ }' w# @ pre=new int[size];
! [  {9 z7 k4 v9 Z if(pre==0) throw "error";
; E/ o) ~3 l$ n5 _* X! G}</P>' h6 B! g& M  O8 W2 `
<>String&amp; String:perator=(const String&amp; s)1 p" r5 `3 s$ o; W
{" Z, x$ Q! O1 H! X  C0 W; n- Y
if(s.size!=size)/ ]0 u( G0 |! x) C2 ~; p+ b
{
3 U% V! ?6 g/ W  delete[] str;  E" F/ X' K% [# {
  str=new char[s.size];
/ o4 B' x% H  `  if(str==0)& V, O8 x3 Y' G6 ?9 h5 Q. j# e( D
   throw "error";1 j* C' Y  p7 V3 \
  size=s.size;7 v7 u2 T3 Y$ q
}/ A! ~( s) ]7 O0 m# J; M6 i* J( o4 I. l
strcpy(str,s.str);
1 @2 D) l+ |5 o. J4 W& x) g: r/ } return *this;
1 G+ s+ L! v$ c$ I) r}</P>& B  V, z" [4 O; l+ h" h, I
<>String&amp; String::change(int *p,int n)//将整型数组改成字符串
- T/ u% x" W2 R& q{
0 U: G2 M" }, a int i;
  h' h6 J# R3 u3 m) i delete[] str;
2 X3 Z  ~9 t  ^/ z/ I0 h! X str=new char[n+1];
6 l& F4 ^* J" J8 \+ d( H2 Z! { for(i=0;i&lt;n;i++)4 E/ C4 S% T& O6 ^* q# `$ J
  if(p&gt;=0&amp;&amp;p&lt;=9), B# g3 T' a: @1 ^: l
   str=p+48;
; E8 D& J6 z( p% B. W: n  else  Z' ~/ |  h; Z( n) r
   switch(p)  W% T7 w0 V8 f* l7 {% V' d, w0 O
   {
  Q8 L3 B8 X6 x6 ?+ J       case 10: str='A'; break;
  c' j- t  V6 v1 r; d: P: O    case 11: str='B'; break;+ A. C# z$ q) g" ~* p, E3 I/ K& n, }, t
    case 12: str='C'; break;$ u( ?6 u7 r6 u* t6 N+ m% N
       case 13: str='D'; break;& i7 m3 S" s! ^" d
    case 14: str='E'; break;6 w/ M' m! i/ l8 d" z7 M6 u
    case 15: str='F'; break;
# z; b4 W, h$ b   }
0 X  ~- p$ A2 _  str[n]='\0';
* h+ S" u! c$ H' t  return *this;0 j, V4 W2 k0 d' p9 M
}: f; t5 a3 f/ e, b
int String::get()//输入一个字符串
6 U8 b8 m; i  q{% v/ N6 `  T% j
char tmp[40000];& V/ E! P6 E% [8 @/ i. G/ T. W% N7 p$ d
in&gt;&gt;tmp;+ R, e) h: v6 L7 ~7 F) h, ]
delete[] str;1 R4 s7 X# E3 R+ I4 Y4 V( g' K  O
size=strlen(tmp)+1;
; w7 E9 t& K6 \; p1 y1 [ str=new char[size];% A: X# G! q' b9 I) f
if(str==0)
( M8 h1 s; p' Q/ v3 M  throw "error";
) T! R$ S) E+ c! i- P strcpy(str,tmp);
. v  |% w2 E2 [* ] return size-1;
" K  j7 r: T! j1 P8 L5 N}</P>
7 Q' k. S! g5 U3 A<>void String::get(int *p)//将字符串改成整型数组7 g* {4 a- H5 _# z7 {
{( x% s' U8 w5 n
int i,j;$ H8 K2 h- ]( ~- N5 f. ?
for(i=0,j=size-2;j&gt;=0;i++,j--)
7 |1 A7 I8 w  ^& u% b  if(str[j]&gt;='0'&amp;&amp;str[j]&lt;='9')* X5 Y9 F7 h& u4 z
      p=str[j]-48;
% h9 G* e6 J4 @- ^6 F  else
' X$ g$ o' a4 h; p, r) z+ ]! I. d  {/ ], Q/ n6 R$ U1 {
   switch(str[j])8 C% z8 x( R; ~, ~: ^/ V  X$ {
   {* f# f; O( o" A4 a/ n2 ?$ W
       case 'A': p=10; break;
' J. D% E0 i1 `+ [) L9 o    case 'B': p=11; break;# d* L" O1 j- d7 `. T! v; q
    case 'C': p=12; break;, @; L+ P' I# g' h
       case 'D': p=13; break;
% b: {. O' L6 U# }; {& n    case 'E': p=14; break;
# ^, t0 ?8 c; P# w- q    case 'F': p=15; break;8 e* Y. T( e, j, R
   }
8 O; U% |) ?2 V! |9 D/ w- c  }
3 ?+ A2 g" C3 d- |}</P># ?* O, |0 q, [" Y3 f8 Y
<>void add(int *p,int &amp;m,int *c,int k)//将一个数同其倒置数相加
7 y( h  _: P  L' u! D8 t" d{* f: j, y+ A# i/ [. M: S
int i,j,a=0;
  z, P) _3 T8 X4 {9 d9 \* P* c: d    for(j=m-1,i=0;j&gt;=0 &amp;&amp; i&lt;m;j--,i++)
! I6 J$ E  O* X' H9 v9 W5 I: { {3 E% h7 G2 ?% Y4 T6 C3 `
     c=p+p[j]+a;) ?" H% X, L0 J4 R
  a=0;
9 ^! m/ `; ~5 ]  w3 ]9 A  if(c&gt;=k)
& J$ g! S- v& v  |, k& t  {2 i6 h4 v% |9 y
   a=c/k;
; D6 H6 Y9 {" a7 `" T+ W8 O   c=c%k;
/ p7 m, Z% Z9 @- w% c" M  }
; `8 _" e* R( x0 g }
9 F  D" @  Y; z# Y3 b if(a!=0)
* r" u5 L& F3 q+ o4 u1 F/ E; }- [ {
$ {6 Z& \" f" v" L  c=a;
: ]. s' F# \3 h6 A, K) S* c  m++;
) c9 p0 E$ ~: `/ z' E" Q; u }- h8 ^4 T6 n: W+ q- a
}</P># H6 S, p5 L7 s. B: M
<>bool match(int *a,int n)//判断是否为回文数) T7 v2 B% x3 k  T
{" O/ Z9 T1 f: {* B& l8 ^: R5 a
int i,j,h=0;
9 u( }0 g9 |/ n0 `. P, u# V3 S for(i=0,j=n-1;i&lt;=n/2 &amp;&amp; j&gt;=n/2;i++,j--)
( C" P. q$ _; Z6 h {: R. Y2 y. J4 |9 L* j' {
  if(a==a[j])
" ~6 d. o  ?3 u   continue;1 {, u1 @$ J# P! }
        h=1;
' t9 R7 a( ]  t$ y4 a( ^, w; Q  break;
& v1 v4 d4 W* E: K4 O& N }, f1 P" z* v# N
if(h==0)( b$ D' J! W0 g/ ]3 i+ y- K
  return true;3 ^, {, P. O2 y0 I
else
' p3 }/ F3 z5 v  return false;8 ~* L. g" P; \1 c- R0 w0 F; G
}' w& k4 G% T1 A: t( P1 ^
//clock_t start,finish;3 Q$ a! q2 v, {! b/ N
int main()! S) x+ Y  W( M4 I+ T
{//start=clock();) j0 Q1 ~6 n4 c1 `7 i3 w+ Y
if(in.fail())/ E$ M+ {3 m1 i; i: ?4 A
{
$ ?* D* P( J- J! P* y- ~  cout&lt;&lt;"the input.txt is not exist!";
) j2 b; v! C. a; ~/ a) h! M  exit(1);( \- x' ]( w( S9 H% q* V; C5 [
}3 o; o1 t1 g' f1 c8 l5 F6 O
String s,s1;
  s+ L: d2 G. [! _7 O; \) ?5 D+ E int n,g,k,*a,*c,m,h=0;
7 @, u4 A! F3 U: K0 j7 T$ w* T    in&gt;&gt;k&gt;&gt;g;
$ L; s/ R6 K1 i    s.get();
! j. G/ |; P0 u( K* x+ ^
! @* f: _0 I  }3 P* ?$ I9 i$ `, |    n=s.length();; E; K0 A  }' o, W
m=n+g+1;
1 p5 g: \; e- q+ p" N% O- v a=new int[m];" p2 T3 e' a* I, M! Y3 t. ^# W( m& j
c=new int[m];
" N. j6 v" ^) T, d$ M# C3 x s.get(a);
4 n3 N9 x, i: v' H2 P3 x if(match(a,n))
6 A1 W- R3 r# T$ c5 a {% c( B: b) g- a; F
  out&lt;&lt;0&lt;&lt;endl;' Z: P1 ^# ~2 z9 q+ @
  s.display();
2 F  h2 c' V4 h  return 1;- @% s( \: e# H3 r
}" ?8 P' t7 C0 \: H$ P- q
do9 q; g1 u$ x; \% o
{
3 a. o& s' w; r( c' P" l     if(h%2==0)
* S  c4 w  D& c# b1 @      add(a,n,c,k);
2 x4 H2 r5 p+ f! Y4 f* W  else  W9 V& g* ?8 X
   add(c,n,a,k);
4 U; U0 Y7 N- }  h++;
( k+ G% t# I- u7 b  if(h&gt;g)
9 t9 Q% ]7 h' ]" j5 j/ @) C3 A8 z# b   break;
. E) Y/ H, B5 b+ { }
+ X6 }7 l: _* D, J# e while(!match(a,n)&amp;&amp;!match(c,n));
& a( p# y$ A8 Y. z/ y/ f4 f if(h&gt;g)' @  x  v+ [6 V
     out&lt;&lt;"No Solution!"&lt;&lt;endl;
) k& b# ^' q  ^6 X+ h else4 p: V0 e8 F1 \  U' O( j; j& I
{- K7 Y5 y$ d9 h
      out&lt;&lt;h&lt;&lt;endl;
+ g1 G% P% k- p% {1 t+ g     if(h%2==0)# u  g/ ]& Q2 {0 H# \
      s1.change(a,n);
, O$ h* w' `# d- O' P     else
/ D) c: T5 ^& J2 u- `7 _      s1.change(c,n);, H- D" ^% n. L% s, }) @
     s1.display();
7 ?, O* Q8 T+ X: h! {! g8 t }' y* f' \  W& m  O! g
delete[] a;
& J7 \6 g8 [, q* y: x% k. s delete[] c;  i+ L6 D% U. G) e" n: v
// finish=clock();' M% B9 O  X, Z4 ^2 F
// cout&lt;&lt;finish-start&lt;&lt;endl;
. ^5 T' O4 y4 Y return 1;
7 Y$ a9 V8 S# [$ b}</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
我相信今天的埋头苦读是明天的出人头地
txj66        

2

主题

2

听众

42

积分

升级  38.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

zxl_lucky        

15

主题

2

听众

66

积分

小木屋

升级  64.21%

该用户从未签到

新人进步奖

回复

使用道具 举报

sabbanji        

0

主题

3

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

  一个指针从头向尾走,一个指针从尾向头走,至多走到两个指针相遇或相错,就可以检查出是否为回文了。上面的代码怎么弄得这么复杂?
回复

使用道具 举报

darkghost        

0

主题

3

听众

22

积分

升级  17.89%

该用户从未签到

新人进步奖

我觉得用堆栈也可以实现吧,先将各元素压栈,然后将其中的元素复制到另外一个栈中,再出栈比较。<br/>呵呵,可能还要麻烦,没做过。。。<br/>
回复

使用道具 举报

mustpeter        

0

主题

3

听众

23

积分

升级  18.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

zhuph        

0

主题

3

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

hero1632        

0

主题

0

听众

17

积分

升级  12.63%

该用户从未签到

新人进步奖

回复

使用道具 举报

friendfb        

0

主题

3

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

<p>设计算法的时候,应该充分考虑时间效率和空间效率!但是两者往往也是互相矛盾的。一个好的算法可以应该权衡这两个方面;或者更加特定的需求来设计算法。</p><p>在我的记忆中,回文是需要考虑标点符号的吧</p><p></p>
回复

使用道具 举报

0

主题

3

听众

72

积分

升级  70.53%

该用户从未签到

新人进步奖

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-3 12:26 , Processed in 0.557889 second(s), 110 queries .

回顶部