这是我在网上搜的代码,因为我实在不会写,想了好几天都没有想出来。费了好大劲,终于看懂了人家的代码,看完之后我真的好感动,这么好的代码是谁写出来的啊,思路设计的那么严密又恰到好处,似乎没有一点的多余的代码,程序简洁干脆。我真是佩服!我还处于学习阶段,人家的好代码,我就得向人家学习,吸取其中的精华,加以消化吸收,加上自己的理解,让它变成我自己的东西,以促进我的成长。下面就是我对这段代码的理解,真的很精辟啊!
#include<iostream>
#include<string>
using namespace std;
string exchange(string s)//完成字符串的转化。
{
int i;
int j=0;
int num[10]={0};
char late[80];
for(i=0;i<s.length();i++)
{
num[s[i]-'0']++;//将字符转换成整形值,并且记录每一个数字的个数,存到相对应的数组元素中。
}
for(i=0;i<10;i++)//一下分两种情况:一个是个数大于10的,一个是小于10的;大于10的要将十位
{ //和个位分开存储。
if(num[i]>0&&num[i]<10)
{
late[j++]=num[i]+'0';//这里同样是将整形转换成字符型。(下同)
late[j++]=i+'0';
}
else if(num[i]>=10)
{
late[j++]=num[i]/10+'0';
late[j++]=num[i]%10+'0';
late[j++]=i+'0';
}
}
late[j]='/0';//字符串以字符'/0'结尾。
return late;
}
void judge(string s)//对字符串进行判断
{
int i,j;
bool ok=false;//或是int ok=0;
string temp=s;
string prev[16];
for(i=0;i<15;i++)
{
temp=exchange(temp);
for(j=0;j<i;j++)//这个for循环是使每一个刚转换过的字符串和已经存储的字符串逐一进行比较,
{ //看是否有一样的。
if(temp==prev[j])
{
ok=true;
break;
}
}
if(ok)
{
if(j==0&&i==1)//这里的判断条件很是关键,也很巧妙。
{
cout<<s<<" is self-inventorying"<<endl; return;
}
else if(j==i-1)//条件的判断可以通过举例来更形象的说明。
{
cout<<s<<" is self-inventorying after "<<i<<" steps"<<endl;
return;
}
else
{
cout<<s<<" enters an inventory loop of length "<<i-j<<endl;
return;
}
}
prev[i]=temp;//整体看来,就是temp暂时接受转换过的字符串,比较之后,temp再把字符串
//存放到prev[i]数组中。
}
cout<<s<<" can not be classified after 15 iterations"<<endl;
}
int main()
{
string s;
while(1)
{
cin>>s;
if(s=="-1")
break;
judge(s);
}
return 0;
}
本文介绍了一个用于判断和转化字符串的C++程序。该程序能够处理特定形式的字符串,通过计数字符串中每个数字出现的次数并重新组织这些信息,进而判断字符串是否为自清点(self-inventorying)。程序包含主要功能函数`exchange`用于字符串转化,及`judge`函数用于判断字符串类别。
1292

被折叠的 条评论
为什么被折叠?



