题意:主要考察对循环的控制。难度:2星。
题目不算复杂,解题思路比较清晰,但在关键的几行代码上,需要仔细对循环的临界值进行仔细斟酌。
刚开始写的时候,并没有考虑全面,需要用测试用例慢慢调试。
粗心少写一行输出,导致在大数据用例处出现错误。
题解代码:
/*
* Read Phone Number - Round A China New Grad Test 2014
*
*
*/
#include <iostream>
#include <fstream>
using namespace std;
#define MAX_NUMBER_LENGTH 101
char numberString[][8] = {" zero", " one", " two", " three", " four", " five", " six", " seven", " eight", " nine"};
int main()
{
ifstream inputFile;
ofstream outputFile;
int T;
char phoneNumber[MAX_NUMBER_LENGTH];
int format[MAX_NUMBER_LENGTH];
int devideCnt, sameCnt, numLen;
int caseNo, i, j, k;
char numInEnglish[8];
inputFile.open("E:\\C++\\GCJ\\China New Grad Test 2014\\Round A\\Read Phone Number\\A-large-practice.in");
outputFile.open("E:\\C++\\GCJ\\China New Grad Test 2014\\Round A\\Read Phone Number\\A-large-practice.out");
inputFile >> T;
for (caseNo = 1; caseNo <= T; caseNo++)
{
cout << "Case #" << caseNo << ':';
outputFile << "Case #" << caseNo << ':';
inputFile >> phoneNumber;
numLen = strlen(phoneNumber);
inputFile >> format[0];
for (i = 1, numLen -= format[0]; numLen; i++)
{ /* 将读数格式存入整型数组 */
inputFile.get(); /* 吸收'-' */
inputFile >> format[i];
numLen -= format[i];
}
devideCnt = i; /* 记录号码被分成的段数 */
for (i = 0, j = 0; i < devideCnt; i++) /* 分段处理 */
{
for (k = 0; k < format[i]; ) /* 对于每一段 */
{ /* 对临界值的斟酌很重要!!! */
/* 这段代码慢慢琢磨 */
/* 计算号码重复的次数 */
for (sameCnt = 1; phoneNumber[j + k] == phoneNumber[j + 1 + k++] && k < format[i]; sameCnt++);
switch (sameCnt)
{
case 1:
break;
case 2:
cout << " double";
outputFile << " double";
break;
case 3:
cout << " triple";
outputFile << " triple";
break;
case 4:
cout << " quadruple";
outputFile << " quadruple";
break;
case 5:
cout << " quintuple";
outputFile << " quintuple";
break;
case 6:
cout << " sextuple";
outputFile << " sextuple";
break;
case 7:
cout << " septuple";
outputFile << " septuple";
break;
case 8:
cout << " octuple";
outputFile << " octuple";
break;
case 9:
cout << " nonuple";
outputFile << " nonuple";
break;
case 10:
cout << " decuple";
outputFile << " decuple";
break;
default:
for (int tmp = 0; tmp < sameCnt - 1; tmp++)
{ /* 连续的数字超过11个时,循环输出 重复次数-1 次 */
/* 因为下段语句还会输出最后一次 */
cout << numberString[phoneNumber[j + k - 1] - '0'];
outputFile << numberString[phoneNumber[j + k - 1] - '0'];
}
}//switch (sameCnt)
cout << numberString[phoneNumber[j + k - 1] - '0'];
outputFile << numberString[phoneNumber[j + k - 1] - '0'];
}//for (k = 0; k < intFormat[i]; )
j += format[i];
}//for (i = 0, j = 0; i < devideCnt; i++)
cout << endl;
outputFile << endl;
}//for (caseNo = 1; caseNo <= T; caseNo++)
inputFile.close();
outputFile.close();
system("pause");
return 0;
}