1. 程式人生 > >輸入阿拉伯數字(整數),輸出相應的中文(美團網2014年9月16日筆試題目之中的一個)

輸入阿拉伯數字(整數),輸出相應的中文(美團網2014年9月16日筆試題目之中的一個)

++i 方式 data ++ name int end == pri

2014年9月16日,美團網南京筆試題之中的一個。原要求是輸入整數的位數最多為四位。這裏擴展為12為,即最高到千億級別。

思路及步驟:

1 判別輸入是否合法,並過濾字符串最前面的‘0’。

2 將字符串劃分成四位一組的形式,當中每一組四位整數的輸出方式同樣。如20402040,其前四位和後四位都是2040。都輸出“二千零四十”,僅僅只是前四位要添上‘萬’字而已。

3 將8~12位、4~8位、0~4位的數字分成三種情況輸出

另外:形如10230401,應讀為:“一千零二十三四百零一”,所以在每輸出完一組數字後。應考察下一組的首位是否為0。視情況輸出‘零’。

以下是實現代碼:

char *arrayOfDigit[10] = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
char *arrayOfIndex[7] = { "", "", "十", "百", "千", "萬", "億" };

void printGroupOf4(char *pStart, char *pEnd)
{
	int index = pEnd - pStart + 1; // 確定位數,用於在數字後加入“十、百、千”

	// 過濾字符串最前面的‘0’
	while (pStart <= pEnd && *pStart == ‘0‘){
		++pStart;
		--index;
	}

	// 此時pStart可能“所處位置”與“字符串相應的形式”:千位(yxxx)、百位(0yxx)、十位(00yx)、個位(000y),
	// 或者直接退出(0000),當中y表示非零的整數,x表示未知的整數
	while (pStart <= pEnd && *pStart != ‘0‘){
		cout << arrayOfDigit[*pStart - ‘0‘] << arrayOfIndex[index];
		++pStart;
		--index;
		if (pStart > pEnd){
			return;
		}
	}

	// 設置標記。確定是否應該輸出‘零’
	bool flag = false;
	while (pStart <= pEnd && *pStart == ‘0‘){
		++pStart;
		--index;
		flag = true;
	}
	if (flag == true && pStart <= pEnd)
		cout << arrayOfDigit[0];

	// 打印最後面的轉換後的字符串序列。此時pStart,要麽到達非零的十位。要麽直接到達了個位
	while (pStart <= pEnd && *pStart != ‘0‘){
		cout << arrayOfDigit[*pStart - ‘0‘] << arrayOfIndex[index];
		++pStart;
		--index;
		if (pStart > pEnd){
			return;
		}
	}
}

void digitToChinese(char *pStr)
{
	if (!pStr)
		return;

	int numberLength = strlen(pStr);

	// 檢查符號位
	if (pStr[0] == ‘-‘){
		cout << "負";
		++pStr;
		--numberLength;
	}
	else if (pStr[0] == ‘+‘){
		++pStr;
		--numberLength;
	}

	// 過濾字符串前面的0
	while (*pStr == ‘0‘){
		++pStr;
		--numberLength;
	}

	// 檢查後面的數字是否合法
	for (int i = 0; i<numberLength; ++i){
		if (pStr[i] > ‘9‘ || pStr[i] < ‘0‘)
		{
			cout << "輸入字符串不合法!" << endl;
			return;
		}
	}

	// 當輸入為0時
	if (numberLength == 0){
		cout << arrayOfDigit[0];
		return;
	}

	if (numberLength > 12){
		cout << "輸入數字超出表示範圍(千億級)" << endl;
		return;
	}

	// 處理前四位
	if (numberLength > 8){
		printGroupOf4(pStr, pStr + numberLength - 9);
		cout << arrayOfIndex[6];
		if (*(pStr + numberLength - 8) == ‘0‘) // 千萬位為0
			cout << arrayOfDigit[0];
		
		pStr = pStr + numberLength - 8;
		numberLength = 8;
	}

	// 處理中間四位
	if (numberLength > 4){
		printGroupOf4(pStr, pStr + numberLength - 5);
		cout << arrayOfIndex[5];
		if (*(pStr + numberLength - 4) == ‘0‘) // 千位為0
			cout << arrayOfDigit[0];

		pStr = pStr + numberLength - 4;
		numberLength = 4;
	}

	// 處理最後四位
	printGroupOf4(pStr, pStr + numberLength - 1);
	
}


int main(void)
{
	char p[20];

	cout << "請輸入小於12位的數字:" << endl;

	cin >> p;

	digitToChinese(p);

	return 0;
}




輸入阿拉伯數字(整數),輸出相應的中文(美團網2014年9月16日筆試題目之中的一個)