PUK1016 Numbers That Count 的解法

本文介绍了一个用于判断和转化字符串的C++程序。该程序能够处理特定形式的字符串,通过计数字符串中每个数字出现的次数并重新组织这些信息,进而判断字符串是否为自清点(self-inventorying)。程序包含主要功能函数`exchange`用于字符串转化,及`judge`函数用于判断字符串类别。

这是我在网上搜的代码,因为我实在不会写,想了好几天都没有想出来。费了好大劲,终于看懂了人家的代码,看完之后我真的好感动,这么好的代码是谁写出来的啊,思路设计的那么严密又恰到好处,似乎没有一点的多余的代码,程序简洁干脆。我真是佩服!我还处于学习阶段,人家的好代码,我就得向人家学习,吸取其中的精华,加以消化吸收,加上自己的理解,让它变成我自己的东西,以促进我的成长。下面就是我对这段代码的理解,真的很精辟啊!

#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;

}

这个程序唯一的不足之处是不能一行一行的输入字符串,然后一起执行,一起输出。
不知该怎么改进,努力!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值