以下来自点击打开链接:
#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; }