回文问题(用c++编写)
<P>**** Hidden Message *****#include<iostream>#include<fstream>
#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& s);
~String() {delete[] str; delete[] pre;}
String& operator=(const String& s);
int length()const {return size-1;}
int get();
String& change(int *p,int n);
void get(int *p);
void display(){out<<str<<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&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& String::operator=(const String& 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& String::change(int *p,int n)//将整型数组改成字符串
{
int i;
delete[] str;
str=new char;
for(i=0;i<n;i++)
if(p>=0&&p<=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>>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>=0;i++,j--)
if(str>='0'&&str<='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 &m,int *c,int k)//将一个数同其倒置数相加
{
int i,j,a=0;
for(j=m-1,i=0;j>=0 && i<m;j--,i++)
{
c=p+p+a;
a=0;
if(c>=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<=n/2 && j>=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<<"the input.txt is not exist!";
exit(1);
}
String s,s1;
int n,g,k,*a,*c,m,h=0;
in>>k>>g;
s.get();
n=s.length();
m=n+g+1;
a=new int;
c=new int;
s.get(a);
if(match(a,n))
{
out<<0<<endl;
s.display();
return 1;
}
do
{
if(h%2==0)
add(a,n,c,k);
else
add(c,n,a,k);
h++;
if(h>g)
break;
}
while(!match(a,n)&&!match(c,n));
if(h>g)
out<<"No Solution!"<<endl;
else
{
out<<h<<endl;
if(h%2==0)
s1.change(a,n);
else
s1.change(c,n);
s1.display();
}
delete[] a;
delete[] c;
// finish=clock();
// cout<<finish-start<<endl;
return 1;
}</P> <P>谢谢</P> <P>谢谢 啊啊 </P> 一个指针从头向尾走,一个指针从尾向头走,至多走到两个指针相遇或相错,就可以检查出是否为回文了。上面的代码怎么弄得这么复杂? 我觉得用堆栈也可以实现吧,先将各元素压栈,然后将其中的元素复制到另外一个栈中,再出栈比较。<br/>呵呵,可能还要麻烦,没做过。。。<br/> <p>回文是什么意思?</p> 有没有汇编写的? <p>不错,正在找</p> <p>设计算法的时候,应该充分考虑时间效率和空间效率!但是两者往往也是互相矛盾的。一个好的算法可以应该权衡这两个方面;或者更加特定的需求来设计算法。</p><p>在我的记忆中,回文是需要考虑标点符号的吧</p><p></p> 什么啊???
页:
[1]
2