Read Phone Number - Round A China New Grad Test 2014 - 循环控制

Read Phone Number

题意:主要考察对循环的控制。难度: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值