现在的位置: 首页 > 综合 > 正文

POJ 1016(Numbers That Count)解题纠错

2014年06月14日 ⁄ 综合 ⁄ 共 5297字 ⁄ 字号 评论关闭

以下来自点击打开链接:

#include <iostream>
#include <vector>
#include <string>

using namespace std;
/*将输入字符串中的所有数字出现的次数都统计出来,存放在countArray中*/
void CountEveryDigit(string inputString);
/*将countArray中的数据转换成字符串,也就是经过一次转换之后生成的数字*/
string GetString();
/*一个递归函数,将每次转换生成的数都放在vector中,每次递归中都会进行判断,如果之前已经存在这个数那么就结束*/
void CheckInventory(string curString,vector<string>& myVector);
bool CheckVector(string curString,vector<string>& myVector);
static int count=0;//代表递归的次数
static int disToFirst=0;//表示在vector中寻找到相同的字符串时和第一个元素相距多远
string nextString="";
#define MAX_NUMBER 100
int countArray[10];
vector<string> myVector;
string result[1000];
int main()
{
char inputString[100];
memset(countArray,0,sizeof(int)*10);
int j=0;
//在输入为-1的时候结束
while(cin>>inputString,strcmp(inputString,"-1")!=0)
{
count=0;
//每次进入将vector清空
myVector.clear();
CheckInventory(inputString,myVector);
//如果递归次数不多于15次
if(count<=15)
{
if(disToFirst==0)
{

if(count==1)
{
result[j]=inputString;
result[j]+=" is self-inventorying";
}
else  
{
char ch[10];
_itoa((count),ch,10);
result[j]=inputString;
result[j]+=" enters an inventory loop of length ";
result[j]+=ch;
}

}
else  
{

if((count-disToFirst)==1)
{
char ch[10];
_itoa((count-1),ch,10);
result[j]=inputString;
result[j]+=" is self-inventorying after ";
result[j]+=ch;
result[j]+=" steps";
}
else  
{
char ch[10];
_itoa((count-disToFirst),ch,10);
result[j]=inputString;
result[j]+=" enters an inventory loop of length ";
result[j]+=ch;
}
}

}
else
{ 
result[j]=inputString;
result[j]+=" can not be classified after 15 iterations";
}
j++;

}
int i;
for(i=0;i<j;i++)
{
cout<<result[i]<<endl;
}
system("pause");
return 1;
}
void CountEveryDigit(string inputString)
{

string::const_iterator iter;
int length=strlen(inputString.c_str());
int i;

for(i=0;i<length;i++)
{
char ch=inputString.c_str()[i];
if(ch=='0')
countArray[0]++;
if(ch=='1')
countArray[1]++;
if(ch=='2')
countArray[2]++; 
if(ch=='3')
countArray[3]++;
if(ch=='4')
countArray[4]++;
if(ch=='5')
countArray[5]++;
if(ch=='6')
countArray[6]++;
if(ch=='7')
countArray[7]++;
if(ch=='8')
countArray[8]++;
if(ch=='9')
countArray[9]++;

}
}
void CheckInventory(string curString,vector<string>& myVector)
{
if(count==16)return ;
if(CheckVector(curString,myVector)==false)
{
myVector.push_back(curString);
memset(countArray,0,sizeof(int)*10);
CountEveryDigit(curString);

nextString=GetString();
count++;
CheckInventory(nextString,myVector);
}
else return;

}
string GetString()
{
string s="";
int i;
for(i=0;i<10;i++)
{
if(countArray[i]!=0)

{
char ch[10];
_itoa(countArray[i],ch,10);
s+=ch;
s+=(i+48);
}
}
return s;
}
bool CheckVector(string curString,vector<string>& myVector)
{
vector<string>::const_iterator iter;
for(disToFirst=0,iter=myVector.begin();iter!=myVector.end();iter++)
{

if(strcmp(curString.c_str(),iter->c_str())==0)break;
disToFirst++;
}
if(iter!=myVector.end())
{

return true;
}
else return false;

该程序把所有输出存在一个数组里:

string result[1000];

如果输入的用例数超过1000,将出现runtime error。

改为:
string result;
每产生一个result,就立刻输出。

以下修改AC:

#include <iostream>
#include <vector>
#include <string>

using namespace std;
/*将输入字符串中的所有数字出现的次数都统计出来,存放在countArray中*/
void CountEveryDigit(string inputString);
/*将countArray中的数据转换成字符串,也就是经过一次转换之后生成的数字*/
string GetString();
/*一个递归函数,将每次转换生成的数都放在vector中,每次递归中都会进行判断,如果之前已经存在这个数那么就结束*/
void CheckInventory(string curString,vector<string>& myVector);
bool CheckVector(string curString,vector<string>& myVector);
static int count=0;//代表递归的次数
static int disToFirst=0;//表示在vector中寻找到相同的字符串时和第一个元素相距多远
string nextString="";
#define MAX_NUMBER 100
int countArray[10];
vector<string> myVector;
string result;
int main()
{
char inputString[100];
memset(countArray,0,sizeof(int)*10);
int j=0;
//在输入为-1的时候结束
while(cin>>inputString,strcmp(inputString,"-1")!=0)
{
count=0;
//每次进入将vector清空
myVector.clear();
CheckInventory(inputString,myVector);
//如果递归次数不多于15次
if(count<=15)
{
if(disToFirst==0)
{

if(count==1)
{
result=inputString;
result+=" is self-inventorying";
}
else  
{
char ch[10];
_itoa((count),ch,10);
result=inputString;
result+=" enters an inventory loop of length ";
result+=ch;
}

}
else  
{

if((count-disToFirst)==1)
{
char ch[10];
_itoa((count-1),ch,10);
result=inputString;
result+=" is self-inventorying after ";
result+=ch;
result+=" steps";
}
else  
{
char ch[10];
_itoa((count-disToFirst),ch,10);
result=inputString;
result+=" enters an inventory loop of length ";
result+=ch;
}
}

}
else
{ 
result=inputString;
result+=" can not be classified after 15 iterations";
}
cout<<result<<endl;
//j++;

}
/*
int i;
for(i=0;i<j;i++)
{
cout<<result[i]<<endl;
}
system("pause");*/
return 1;
}
void CountEveryDigit(string inputString)
{

string::const_iterator iter;
int length=strlen(inputString.c_str());
int i;

for(i=0;i<length;i++)
{
char ch=inputString.c_str()[i];
if(ch=='0')
countArray[0]++;
if(ch=='1')
countArray[1]++;
if(ch=='2')
countArray[2]++; 
if(ch=='3')
countArray[3]++;
if(ch=='4')
countArray[4]++;
if(ch=='5')
countArray[5]++;
if(ch=='6')
countArray[6]++;
if(ch=='7')
countArray[7]++;
if(ch=='8')
countArray[8]++;
if(ch=='9')
countArray[9]++;

}
}
void CheckInventory(string curString,vector<string>& myVector)
{
if(count==16)return ;
if(CheckVector(curString,myVector)==false)
{
myVector.push_back(curString);
memset(countArray,0,sizeof(int)*10);
CountEveryDigit(curString);

nextString=GetString();
count++;
CheckInventory(nextString,myVector);
}
else return;

}
string GetString()
{
string s="";
int i;
for(i=0;i<10;i++)
{
if(countArray[i]!=0)

{
char ch[10];
_itoa(countArray[i],ch,10);
s+=ch;
s+=(i+48);
}
}
return s;
}
bool CheckVector(string curString,vector<string>& myVector)
{
vector<string>::const_iterator iter;
for(disToFirst=0,iter=myVector.begin();iter!=myVector.end();iter++)
{

if(strcmp(curString.c_str(),iter->c_str())==0)break;
disToFirst++;
}
if(iter!=myVector.end())
{

return true;
}
else return false;
}

 

抱歉!评论已关闭.