QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>
游客,如果您要查看本帖隐藏内容请回复
#include&lt;iostream&gt;
6 a) {! ^/ q, W8 p7 T1 Z#include&lt;fstream&gt;9 Q% j& `5 d1 Q
#include"string.h"
( I1 l# z; R6 w( I: G0 n4 @% k//#include"time.h"3 _, e0 E4 C; M1 Z6 }
using namespace std;
: e3 y0 A2 q) z& mifstream in("input.txt");
" R' T' W, u' X# k8 e' f- Wofstream out("output.txt");   ?# f- `! C0 a0 z4 `
class String $ r4 y2 ~5 ?" }( T+ b( b5 {: [
{
, B: |6 G9 q5 p; bpublic:
6 B" H2 ^3 _, S String(char *s="");$ Q/ I4 G/ \! b( z: B
String(const String&amp; s);- E& r3 {( [6 t4 }+ D
~String() {delete[] str; delete[] pre;}
. Q* e6 Y) M) O5 I, m7 u/ f String&amp; operator=(const String&amp; s);: f! E- Z: X1 ]/ t
int length()const {return size-1;}
* ^& D' y7 A+ U int get();( F( X8 x( p) R
String&amp; change(int *p,int n);
3 T6 I0 I8 p' O( ]( R( P void get(int *p);/ d# T7 A- |% n
void display(){out&lt;&lt;str&lt;&lt;endl;}
/ y. o! M$ E+ V- P& T! lprivate:
- |3 [/ J4 V! b" T, `" W char *str;
. D# e( h  U! w$ a* P    int  *pre;; u1 O/ |# T- q8 z6 M* L" H9 k
int  size;
' N2 ^+ ]5 z* q6 r% ^};</P>
/ p+ L* h7 y: W1 \* C2 @, z<>String::String(char *s)
1 E! ~1 N2 B& }: c{9 {' e8 G1 B7 t! M( M% Q
size=strlen(s)+1;* H7 G9 q" `# f9 h) P
str=new char[size];
6 }3 g2 o/ ?+ n- T. L if(str==0)  throw "error";
- l# m9 I- U2 j( Q- D strcpy(str,s);2 G9 t0 \3 J7 J0 r7 l8 m1 H3 n
pre=new int[size];
0 L4 C) A. ?3 d2 S# Q. M6 E6 I# d: X# U if(pre==0)  throw "error";4 R4 E/ j" G3 K9 X) b3 y9 k( G
}</P>1 D0 P% s$ R( ]* y8 v/ q  W! B
<>String::String(const String&amp;s)
2 N. `* K, X  n; Z- |9 x{
5 `6 B1 R1 i2 E5 h& f. n# j" U size=s.size;- |9 b2 `( m9 i. ~5 h, @% o3 Z2 e
str=new char[size];/ B7 o" e# i( C* }: [
if(str==0) throw "error";
" v4 W; @) Z. |$ l strcpy(str,s.str);9 r3 I2 Y5 v5 `4 N
pre=new int[size];
1 X. J; ]* q$ s; b" W if(pre==0) throw "error";
: M& c* ?. w' y9 Y}</P>
$ U5 s2 ^0 y* K/ L; C<>String&amp; String:perator=(const String&amp; s)
1 F2 w% k% v  t4 |; T$ ?; W9 S{9 C2 @7 ^6 Y' f* j6 Y' t7 x( {
if(s.size!=size)
/ D9 ?' U5 _6 E7 n7 x {) L1 s: ?+ s' S1 {$ F5 |" x% ^
  delete[] str;! n3 K: m7 i8 H1 f
  str=new char[s.size];6 ]% V0 ?$ r, U% D8 J  Q
  if(str==0)
% W. u. e8 ^* B  P# O7 X; v   throw "error";9 }. e% q+ d/ |: o
  size=s.size;
$ F9 e, W/ k$ ^ }
" Y8 `6 G- y2 s  s8 @! U7 k5 N7 Z strcpy(str,s.str);
6 q. a9 _3 {' r' ]* C/ G- s1 ]# J return *this;& N3 Y  Q" b% I8 Q) G: [- M* ~/ [6 G
}</P>
" K& h9 ^; n# T% L# O; ?0 \<>String&amp; String::change(int *p,int n)//将整型数组改成字符串
- h4 c0 a0 I5 B! c, F3 v( t3 [, j{3 m- G8 ~5 R; F5 x! t' K
int i;
) z  L2 H* [  n% e. I delete[] str;
+ m% n7 h9 o# M5 v6 E5 M: y/ r& h str=new char[n+1];- T% r- c- V, p- t, C( G( M
for(i=0;i&lt;n;i++)
0 ^. X) O6 [4 D1 O# L5 A  if(p&gt;=0&amp;&amp;p&lt;=9)  S: e* z, a: H5 Y  L7 s4 m& T
   str=p+48;
) Q$ I# b$ @! l  }8 J8 F  else
7 q- k! Q9 b& Z6 B% A3 i+ c' @* @9 s   switch(p)
0 g2 D4 C. R9 J   {
5 r% W5 m) Z& i  O( a5 B! W3 J; [       case 10: str='A'; break;3 z# D2 \2 |/ {
    case 11: str='B'; break;/ L0 b5 H; w, ]' R  b/ z* }& O
    case 12: str='C'; break;
! r# j" M- U1 x6 Y0 [* d& \; t" N       case 13: str='D'; break;
# H3 C9 a) e$ j: R$ M- n    case 14: str='E'; break;
& y' \: u% V9 A9 R9 w0 W    case 15: str='F'; break;
/ Z5 G1 J1 d! x   }
+ |6 r1 X8 q9 x' {3 D. X4 X  str[n]='\0';
* p- `# t. s0 m5 S  Y2 U- k  w' o  return *this;9 L% W+ Z" a# T4 c/ k! b
}
9 v  n2 n6 K# Wint String::get()//输入一个字符串
! l4 @* ?! S  y0 B- ~{
; y2 R  b4 X: V# J/ r' h: Q5 S char tmp[40000];
1 s& u3 M( r: z9 g2 u5 _) ?7 u; R in&gt;&gt;tmp;1 Q; Y0 K5 c9 Q+ W0 Y- a! e
delete[] str;: t) t3 ]4 M& w: _6 U
size=strlen(tmp)+1;; B2 {2 k2 F. j: c$ O8 N' G  C
str=new char[size];' b! D1 [1 _3 W) g$ O3 N
if(str==0)
7 T8 x. W8 g9 G! e5 a/ r2 L  throw "error";
. L5 G3 V" U- N( n* q  \9 y strcpy(str,tmp);
) X- I# b2 j" J, J return size-1;
9 U" ~0 g. X' T7 z- k. H}</P>; S$ m+ I- E- O; J# W
<>void String::get(int *p)//将字符串改成整型数组; M1 g# V. u/ l7 V9 ?9 W
{7 b5 {5 w5 ~7 x4 y
int i,j;- u$ Q1 c- i9 z: V( \6 W5 n
for(i=0,j=size-2;j&gt;=0;i++,j--)
3 |' ~" r, l: B9 g  if(str[j]&gt;='0'&amp;&amp;str[j]&lt;='9'), K# `) w  s! T9 x4 l0 a
      p=str[j]-48;
; N7 B% a8 o- j3 P8 Z0 V  else- g7 m) d# ?1 ~, q; s
  {2 }2 @5 o' H; B- r8 g' ^
   switch(str[j])
3 ?" g4 Y9 \: q. z   {
. n* H$ F% g$ M) J1 v3 e1 g       case 'A': p=10; break;
, a8 y* {6 ^6 W3 R8 P* z    case 'B': p=11; break;
1 _! W0 Z# o. a. Y) T; c: e- t    case 'C': p=12; break;
3 \+ o# q0 N6 n: k       case 'D': p=13; break;
9 P; i2 F! N2 X. v    case 'E': p=14; break;
  n3 R2 d4 h5 ^/ |6 M" I. g    case 'F': p=15; break;
) G. P; B" [  x) j7 I& C, C   }& j- H9 F! o/ h- l" K- ]
  }  o* u0 g! j1 I; R( O! y
}</P>
, i. S& @1 r6 Q, v- M  h<>void add(int *p,int &amp;m,int *c,int k)//将一个数同其倒置数相加# v% b& K3 _+ B. b2 O. i
{1 z  U& ~3 f/ l
int i,j,a=0;
# c* o, O9 W1 |. C    for(j=m-1,i=0;j&gt;=0 &amp;&amp; i&lt;m;j--,i++)6 }/ I2 `- }3 O! `7 u. _6 l
{
' }1 x2 b" a/ s3 V9 P$ M     c=p+p[j]+a;
& v1 `+ T1 i! C  a=0;% M3 J" P# @& ^. f
  if(c&gt;=k)& ~3 J; m1 Q; X$ C8 n8 }
  {9 Q& z8 H6 h! K5 G. k
   a=c/k;
0 D; f* u' z8 ^$ ]1 x* b+ L   c=c%k;, {9 G3 c7 v% i. [- g
  }- J% A0 Q% g( ^. v5 Q
}
' m: E/ y& y8 A$ j: K4 J if(a!=0)
2 W- x, y! a5 R& S7 \ {
0 c/ q; Y5 g+ `) U; m  c=a;
1 q+ \3 _) n5 Z5 r! F  m++;7 B: d8 a7 T5 B2 f
}; l+ A5 K; w% n  i1 j8 ?
}</P>, P3 G0 A7 e& x) u4 [7 A' F" _
<>bool match(int *a,int n)//判断是否为回文数" S3 v" y2 I1 Y+ g
{) Z  C3 q" R$ K0 b8 X4 D
int i,j,h=0;
$ l+ F) ?$ M  @& G+ C( y9 T for(i=0,j=n-1;i&lt;=n/2 &amp;&amp; j&gt;=n/2;i++,j--)& I0 h9 [/ d3 q8 v: W0 f
{
2 B8 I) L% `9 @8 ]  if(a==a[j])
' o9 J( t; I* ]  U8 z- ?- q   continue;
: B# W, ~! D% ~' y( H* n/ v        h=1;
& h  [. l- H* N9 m' _  break;, p) o/ v5 A1 b* _1 {, ~7 a: p, |
}# R; X. w8 b' N7 r1 e& ?
if(h==0)
/ i3 N( S: A8 p# l  return true;
3 D, T; a. E' V% f& `: T0 v else ; C& j' K" ?5 G# ^. K) e
  return false;
' g# q( L5 `: o}
  f! T0 ^& `. r: V. U//clock_t start,finish;
; n: S' g: j% V4 p6 [int main()4 e) p8 Q2 Q' D( [
{//start=clock();; `% Z$ I3 m( c; E
if(in.fail())
. K; [1 r( |4 y( N7 n) M9 o' G {
- S$ w$ t% j3 \  cout&lt;&lt;"the input.txt is not exist!";1 Z3 F& o; x! x( g# R: q
  exit(1);9 K- ^8 o* |2 H& T: h  i# a
}% ^" M) _; }# R
String s,s1;
% f5 z' ^* V3 E% b4 Q0 b5 H int n,g,k,*a,*c,m,h=0;6 S& s7 }5 a5 `
    in&gt;&gt;k&gt;&gt;g;   c6 Q1 ?- B! h- o) j0 {
    s.get();
" T* G/ j' T& ?9 V  n( O7 M+ `3 p
: p( A6 y7 y) b* w4 N    n=s.length();
. I; B3 b6 K. c1 l$ _ m=n+g+1;6 t7 ~5 _- n. A( S+ e: T
a=new int[m];7 R$ ~) K9 Q6 h- v
c=new int[m];
. w4 `0 P5 l) e" g7 U1 `# Y* ^6 G s.get(a);3 |% x( n. j" z$ i/ A
if(match(a,n))  |, H. l" U1 C5 I  l
{
  a( O. ~7 z3 ]4 y+ r  out&lt;&lt;0&lt;&lt;endl;1 R1 G$ p" y  a$ k
  s.display();7 F5 e; R  F& L# A& t. m
  return 1;9 o7 C6 A+ ]- k4 t1 s4 ?
}# r! @/ r2 y8 K7 v* \: ~: B
do
/ m, C/ v7 E/ p4 [ {3 c+ [! ]( p/ ^% Q- j
     if(h%2==0)" w' [0 W, _, r6 |; @6 W
      add(a,n,c,k);
0 t* i, d( z" [& W. |! ?  else7 S- M& F6 j8 \+ A/ L( |8 z. P  _
   add(c,n,a,k);$ i4 Q8 t7 Z) ?1 R8 U
  h++;
  ~# A# w. x# I6 x' T7 g8 d$ Q  if(h&gt;g)! D6 O4 O, R& F7 Q+ B" v; z) L
   break;; S' N9 }9 {/ b# ?7 |' S. u
}/ [, b8 M0 g( N' A- N, I; H* J
while(!match(a,n)&amp;&amp;!match(c,n));  A( k; w- j6 ]
if(h&gt;g), T5 j/ @# o2 e5 d: D' d
     out&lt;&lt;"No Solution!"&lt;&lt;endl;
' e2 d& y2 Q3 W# D; X: r else3 l! j, `& i/ q8 ~6 S1 P
{
1 H- `8 B3 j* t9 D0 U2 S      out&lt;&lt;h&lt;&lt;endl;
  P9 |7 M& L: H5 ^     if(h%2==0)
  Y7 I4 ^0 f* l+ @' |" Y$ N! S      s1.change(a,n);
2 a9 A# S5 j5 f     else. w3 E3 C. h: _" V7 l# n, N. d! B
      s1.change(c,n);
0 H# Y" q7 b) `* c! T+ K0 _     s1.display();
1 @) H- z4 r2 {/ x }
+ w! D& e7 O1 i delete[] a;0 Z/ ^& }' \) ?2 ^% ?
delete[] c;6 H; G) f; E6 S$ c- ~* i9 p
// finish=clock();
( p; w, J9 l5 H4 I! G3 `. y4 b( E( U// cout&lt;&lt;finish-start&lt;&lt;endl;% q( ?* V- d0 Q! x% g; }
return 1;9 x" Z( k2 B7 ^; Q4 ^9 d
}</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 14:34 , Processed in 0.401439 second(s), 110 queries .

回顶部