题目12 打印1到最大的n位数
/////////////////////////////////////////////////////////////////////////////////////
// 2.打印1到最大的n位数
// 2.1 方法一:当N很大时,会有溢出问题!!!! void Print1ToMaxOfDigits_1(int iLen) { int iNumber = 1; while (iLen > 0) { iNumber *= 10; iLen--; } for (int i = 1; i < iNumber; i++) { if (i % 20 == 0 && i != 0) { putchar(10); } printf("%3d ", i); } putchar(10); } // 2.2 方法二:字符串上模拟数字加法 bool Increment(char* pszBuff) { bool bOverFlow = false; int iTakeOver = 0; // 进位 int iLen = strlen(pszBuff); for (int i = iLen - 1; i >= 0; i--) { int iSum = pszBuff[i] - '0' + iTakeOver; // 这里什么作用??? --> ++功能??? if (i == iLen - 1) { iSum++; } if (iSum >= 10) { // 退出循环条件!!! if (i == 0) { bOverFlow = true; } else { iSum -= 10; iTakeOver = 1; pszBuff[i] = '0' + iSum; } } else { pszBuff[i] = '0' + iSum; break; } } return bOverFlow; } void PrintNumber(char* pszBuff) { bool bZero = true; int iLen = strlen(pszBuff); for (int i = 0; i < iLen; i++) { // 不打印字符串前面的0 if (bZero && pszBuff[i] != '0') { bZero = false; } if (!bZero) { printf("%c", pszBuff[i]); } } } void Print1ToMaxOfDigits_2(int iLen) { if (iLen <= 0) { return; } char* pszBuff = new char[iLen + 1]; memset(pszBuff, '0', iLen); pszBuff[iLen] = '\0'; int iPrintLen = 0; while (!Increment(pszBuff)) { PrintNumber(pszBuff); printf(" "); iPrintLen++; if (iPrintLen % 20 == 0 && iPrintLen != 0) { putchar(10); } } putchar(10); // 释放内存 delete[] pszBuff; pszBuff = NULL; } // 2.3 把问题转换成数字排列的解法 static int s_PrintNum = 0; void Print1ToMaxOfDigitsRecursion(char* pszBuff, int iLen, int iIndex) { if (iIndex == iLen - 1) { PrintNumber(pszBuff); printf(" "); s_PrintNum++; if (s_PrintNum % 20 == 0) { putchar(10); } return; } for (int i = 0; i < 10; i++) { pszBuff[iIndex + 1] = i + '0'; Print1ToMaxOfDigitsRecursion(pszBuff, iLen, iIndex + 1); } } void Print1ToMaxOfDigits_3(int iLen) { if (iLen <= 0) { return; } char* pszBuff = new char[iLen + 1]; pszBuff[iLen] = '\0'; for (int i = 0; i < 10; i++) { pszBuff[0] = i + '0'; Print1ToMaxOfDigitsRecursion(pszBuff, iLen, 0); } putchar(10); // 释放内存 delete[] pszBuff; pszBuff = NULL; } void Print1ToMaxOfDigitsTestFunc() { cout << "\n\n --------------- Print1ToMaxOfDigitsTestFunc Start -------------->" << endl; int iNum = 2; cout << "方法一: " << endl; Print1ToMaxOfDigits_1(iNum); cout << "方法二: " << endl; Print1ToMaxOfDigits_2(iNum); cout << "方法三: " << endl; Print1ToMaxOfDigits_3(iNum); cout << "\n\n --------------- Print1ToMaxOfDigitsTestFunc End -------------->" << endl; }