标题:请教一个回文问题!
取消只看楼主
sunnyblue
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-4-1
 问题点数:0 回复次数:3 
请教一个回文问题!

请教大家一个回文问题,我是新手,请多多帮忙!感激不尽哦~~ Ex514 回文问题

.问题描述: 试设计一个算法测试一个串t的值是否为回文,即正读和倒读相同。 给定一个k进制数a,其倒置相加运算⊕是将a 的各位数字倒置后再与a 相加。例如, 当a=56 时,⊕a=56+65=121。有些数经过若干次倒置相加运算就成为一个回文数。例如, 56 经过1 次倒置相加运算就变成回文数121。

.编程任务: 给定一个k进制数a,编程计算最少经过多少次倒置相加运算,a 变成回文数。

.数据输入: 由文件input.txt 给出输入数据。第一行有2 个正整数k 和n,k 表示给定的数是k 进制 数,2≤k≤16;n表示执行倒置运算的次数上界,如果经过n次倒置运算,还没有得到回文 数,则输出“No solution!”。第2 行是给定的k进制数a。

.结果输出: 将计算出的最少倒置运算次数和最终得到的回文数输出到文件output.txt。第1 行是最 少倒置运算次数,第2 行是最终得到的回文数。

输入文件示例 输出文件示例 input.txt output.txt 10 15 167 11 88555588

搜索更多相关主题的帖子: 回文问题 倒置 进制 相加 
2005-04-01 21:45
sunnyblue
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-4-1
得分:0 
我想过了,但是编的程序运行后output.txt里什么都没有。请大家帮忙!

2005-04-02 00:26
sunnyblue
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-4-1
得分:0 
我再仔细查一遍,不行再问斑竹。要不也太对不起自己了。~~

顺便问一句,斑竹是不是很强啊!那以后就请多多指教!我也会好好努力的!

2005-04-02 01:00
sunnyblue
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-4-1
得分:0 

我改过了,可是还是不行,数据不对。感觉是不管s1和s2相不相等,都会跳出while循环。不知错在哪,请帮忙看一下!谢谢大家!源代码如下: #include<string.h> #include<iostream> #include<fstream> using namespace std;

NoMem() {cout<<"Error!"<<endl; return 0; }

class String { public: //构造函数 String(char *s=""); String(const String&s); //析构函数 ~String(); //赋值运算 String&operator = (const String&s); //关系运算 bool operator == (const String&s)const; //串长运算 int Length()const; //串接运算 String operator + (const String&s)const; void operator += (const String&s); //查找字符运算 int Find(char c,int start)const; //子串运算 String SubStr(int index,int count)const; //插入运算 void Insert(const String&s,int index); //删除运算 void Delete(int index,int count); //读入字符串 //int ReadString(istream&is=in,char delimiter="\n"); //其他串运算 void Prefix(); void ModifiedPrefix(); int Match(String& t);

char *str;//串数组 int *pre;//前缀函数数组 int size;//串长 };

String::String(char *s) { //串尾有一个空字符 size=strlen(s)+1; str=new char [size]; if(str==0) throw NoMem(); strcpy(str,s); pre=new int [size]; if(pre==0) throw NoMem(); }

String::String(const String&s) { //复制构造函数 size=s.size; str=new char [size]; if(str==0) throw NoMem(); strcpy(str,s.str); pre=new int [size]; if(pre==0) throw NoMem(); }

String::~String()//析构函数 { delete []str; delete []pre; }

bool String::operator ==(const String&s)const { return strcmp(str,s.str)==0; }

int main() { ifstream in("input.txt"); if(in.fail()) {cout<<"the input.txt is not exist!\n"; exit(1); } ofstream out("output.txt");

int num=0,max,k; char x[50]; in>>k; in>>max; in.getline(x,50,'\n'); String s1,s2; strcpy(s1.str,x); //delete []s1.str; //delete []s2.str; char digist[7]={10,11,12,13,14,15}; while(num<=max) { for(int i=0;i<=s1.size-2;i++) //转换成10进制 if(s1.str[i]>='A'&&s1.str[i]<='F') s1.str[i]=digist[s1.str[i]-65]; for(i=0;i<=s1.size-2;i++) //s1倒置到s2中 for(int j=s1.size-2;j>=0;j--) s2.str[i]=s1.str[j]; if(s1.operator ==(s2)) break; else { for(int j=s1.size-2;j>=0;j--)//按位做加法 { s1.str[j]=s1.str[j]+s2.str[j]; if(s1.str[0]>=k)//最高位有进位时多开一位 { String temp; delete []temp.str; strcpy(temp.str,s1.str); s1.size++; delete []s1.str; for(int t=1;t<=s1.size-2;t++) for(i=0;i<=s1.size-3;i++) s1.str[t]=temp.str[i]; s1.str[0]=0; if(s1.str[1]>=k) { s1.str[1]=s1.str[1]%k; s1.str[0]++; } } if(s1.str[j]>=k) { s1.str[j]=s1.str[j]%k; s1.str[j-1]=s1.str[j-1]+1; } } for(i=0;i<=s1.size-2;i++) //转回k进制数 if(s1.str[i]>'9') s1.str[i]=char(s1.str[i]+55); } num++; } if(num>max) out<<"No solution!"<<endl; else { out<<num<<endl; } for(int i=0;i<=s1.size-2;i++)//输出回文 out<<s1.str[i]; return 0; }


2005-04-02 16:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-14598-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.502821 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved