帮忙改进一下算法,谢谢各位!!!

ilpr 2005-09-28 09:27:49
#include<iostream>
#include<vector>
回文数
 若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回
文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是
一个回文数。又如,对于10进制数87,
STEPl: 87+78= 165 STEP2: 165+561= 726
STEP3: 726+627=1353 STEP4:1353+3531=4884
  在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
  写一个程序,给定一个N(2<n<=10,N=16)进制数 M.求最少经过几步可以得到
文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”
----------------------------------------

#include<string>
#include<algorithm>
#include<fstream>

typedef unsigned long Ulong;
using namespace std;

ofstream out("a.txt");

void Add(const vector<int>&,int jin,vector<int> &);//求和函数
void MyCout(const vector<int>&); // 输出函数
void MyFlieCout(const vector<int>&);//象文件输出
int InputJudge(const string&,int &,int);//判断输入,将字母变为数字

void Add(const vector<int>& v,int jin,vector<int> &m)
{
m.push_back(0);
for(Ulong i=0; i<v.size(); i++)
{
if((v[i]+v[v.size()-i-1]) >=jin)//判断是否大于规定的进制,是否进位
{
m[i]+=(v[i]+v[v.size()-i-1])%jin;
m.push_back(1);
}
else
{
if((v[i]+v[v.size()-i-1])==jin-1 && m[i]==1) //当每一位的和为进制的上限时,且上一位有进位的时候
{
m[i]=(m[i]+(v[i]+v[v.size()-i-1]))%jin;
m.push_back(1);
}
else
{
m[i]+=(v[i]+v[v.size()-i-1])%jin;
m.push_back(0);
}
}
}
if((v[0]+v[v.size()-1]) < jin && m[m.size()-1]==0)//砍掉没用的'0'
{
m.erase(m.end()-1,m.end());
}
reverse(m.begin(),m.end());
cout << endl;


}
void MyCout(const vector<int>& v) //输出转化
{
for(Ulong i=0;i<v.size(); i++)
{
switch(v[i])
{
case 10:
cout << "A";
break;
case 11:
cout << "B";
break;
case 12:
cout << "C";
break;
case 13:
cout << "D";
break;
case 14:
cout << "E";
break;
case 15:
cout << "F";
break;
default:
cout << v[i];
break;
}
}
}
void MyFileCout(const vector<int>& v)//向文件输出
{
for(Ulong i=0;i<v.size(); i++)
{
switch(v[i])
{
case 10:
out << "A";
break;
case 11:
out << "B";
break;
case 12:
out << "C";
break;
case 13:
out << "D";
break;
case 14:
out << "E";
break;
case 15:
out << "F";
break;
default:
out << v[i];
break;
}
}

}

InputJudge(const string &m,vector<int>& v,const int &i)//判断输入
{
switch (m[i])
{
case 'A':
case 'a':
v.push_back(10);
break;
case 'B':
case 'b':
v.push_back(11);
break;
case 'C':
case 'c':
v.push_back(12);
break;
case 'D':
case 'd':
v.push_back(13);
break;
case 'E':
case 'e':
v.push_back(14);
break;
case 'F':
case 'f':
v.push_back(15);
break;
default:
v.push_back(m[i]-'0');
break;
}

}
int main()
{

vector<int> v;
vector<int> sum;
int jin,flag=1,mark=1;
Ulong k=1;
string m;
cout << "请输入2-16,选择进制:";
cin >> jin;
while(mark)
{
cout << "请输入数字:";
cin >> m;
mark = 0;

for(Ulong i=0; i<m.size(); i++)
{
InputJudge(m,v,i);
if(v[i] >= jin)
{
cout << "输入有错误,输入的数字每一位必须小于" << jin <<"!"<< endl;
mark=1;
m.clear();
v.clear();
}
}
}
while(flag)
{
Add(v,jin,sum);
for(Ulong i=0; i<sum.size()/2; i++)
{
if(sum[i] != sum[sum.size()-i-1])
{
flag = 1;
break;
}
else
{
flag = 0;
}
}
//输出结果,向屏幕和文件
cout << "Step" << k << ": ";
out << "Step" << k << ": ";
MyCout(v);
MyFileCout(v);
cout << " + ";
out << " + ";
reverse(v.begin(),v.end());
MyCout(v);
MyFileCout(v);
reverse(v.begin(),v.end());
cout << " = ";
out << " = ";
MyCout(sum);
MyFileCout(sum);
cout << endl;
out << endl;

v = sum;
sum.clear();

k++;
if(k>30)
{
flag=0;
cout << "Impossible"<< endl;
}

}
system("pause");
}
...全文
124 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocai0001 2005-10-06
  • 打赏
  • 举报
回复
怎么还没写好啊?

我都以为你写好了呢
我没写了
aayy 2005-10-06
  • 打赏
  • 举报
回复
现在心理很冷!
KingI 2005-10-04
  • 打赏
  • 举报
回复
mark

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧