lynnyan 发表于 2005-4-22 01:27

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

<P>**** Hidden Message *****#include&lt;iostream&gt;
#include&lt;fstream&gt;
#include"string.h"
//#include"time.h"
using namespace std;
ifstream in("input.txt");
ofstream out("output.txt");
class String
{
public:
String(char *s="");
String(const String&amp; s);
~String() {delete[] str; delete[] pre;}
String&amp; operator=(const String&amp; s);
int length()const {return size-1;}
int get();
String&amp; change(int *p,int n);
void get(int *p);
void display(){out&lt;&lt;str&lt;&lt;endl;}
private:
char *str;
    int  *pre;
int  size;
};</P>
<P>String::String(char *s)
{
size=strlen(s)+1;
str=new char;
if(str==0)  throw "error";
strcpy(str,s);
pre=new int;
if(pre==0)  throw "error";
}</P>
<P>String::String(const String&amp;s)
{
size=s.size;
str=new char;
if(str==0) throw "error";
strcpy(str,s.str);
pre=new int;
if(pre==0) throw "error";
}</P>
<P>String&amp; String::operator=(const String&amp; s)
{
if(s.size!=size)
{
  delete[] str;
  str=new char;
  if(str==0)
   throw "error";
  size=s.size;
}
strcpy(str,s.str);
return *this;
}</P>
<P>String&amp; String::change(int *p,int n)//将整型数组改成字符串
{
int i;
delete[] str;
str=new char;
for(i=0;i&lt;n;i++)
  if(p&gt;=0&amp;&amp;p&lt;=9)
   str=p+48;
  else
   switch(p)
   {
       case 10: str='A'; break;
    case 11: str='B'; break;
    case 12: str='C'; break;
       case 13: str='D'; break;
    case 14: str='E'; break;
    case 15: str='F'; break;
   }
  str='\0';
  return *this;
}
int String::get()//输入一个字符串
{
char tmp;
in&gt;&gt;tmp;
delete[] str;
size=strlen(tmp)+1;
str=new char;
if(str==0)
  throw "error";
strcpy(str,tmp);
return size-1;
}</P>
<P>void String::get(int *p)//将字符串改成整型数组
{
int i,j;
for(i=0,j=size-2;j&gt;=0;i++,j--)
  if(str&gt;='0'&amp;&amp;str&lt;='9')
      p=str-48;
  else
  {
   switch(str)
   {
       case 'A': p=10; break;
    case 'B': p=11; break;
    case 'C': p=12; break;
       case 'D': p=13; break;
    case 'E': p=14; break;
    case 'F': p=15; break;
   }
  }
}</P>
<P>void add(int *p,int &amp;m,int *c,int k)//将一个数同其倒置数相加
{
int i,j,a=0;
    for(j=m-1,i=0;j&gt;=0 &amp;&amp; i&lt;m;j--,i++)
{
     c=p+p+a;
  a=0;
  if(c&gt;=k)
  {
   a=c/k;
   c=c%k;
  }
}
if(a!=0)
{
  c=a;
  m++;
}
}</P>
<P>bool match(int *a,int n)//判断是否为回文数
{
int i,j,h=0;
for(i=0,j=n-1;i&lt;=n/2 &amp;&amp; j&gt;=n/2;i++,j--)
{
  if(a==a)
   continue;
        h=1;
  break;
}
if(h==0)
  return true;
else
  return false;
}
//clock_t start,finish;
int main()
{//start=clock();
if(in.fail())
{
  cout&lt;&lt;"the input.txt is not exist!";
  exit(1);
}
String s,s1;
int n,g,k,*a,*c,m,h=0;
    in&gt;&gt;k&gt;&gt;g;
    s.get();

    n=s.length();
m=n+g+1;
a=new int;
c=new int;
s.get(a);
if(match(a,n))
{
  out&lt;&lt;0&lt;&lt;endl;
  s.display();
  return 1;
}
do
{
     if(h%2==0)
      add(a,n,c,k);
  else
   add(c,n,a,k);
  h++;
  if(h&gt;g)
   break;
}
while(!match(a,n)&amp;&amp;!match(c,n));
if(h&gt;g)
     out&lt;&lt;"No Solution!"&lt;&lt;endl;
else
{
      out&lt;&lt;h&lt;&lt;endl;
     if(h%2==0)
      s1.change(a,n);
     else
      s1.change(c,n);
     s1.display();
}
delete[] a;
delete[] c;
// finish=clock();
// cout&lt;&lt;finish-start&lt;&lt;endl;
return 1;
}</P>

txj66 发表于 2005-8-22 02:00

<P>谢谢</P>

zxl_lucky 发表于 2005-8-24 17:02

<P>谢谢 啊啊 </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

什么啊???
页: [1] 2
查看完整版本: 回文问题(用c++编写)