輸入阿拉伯數字(整數),輸出相應的中文(美團網2014年9月16日筆試題目之中的一個)
阿新 • • 發佈:2017-05-20
++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日筆試題目之中的一個)