剑指Offer面试题:9.打印1到最大的n位数
一 题目:打印1到最大的n位数
题目:输入数字n,按顺序打印从1到最大的n位十进制。比如输入3,则打印出1、2、3一直到最大的3位数即999。
二 不考虑大数解法
// 打印从1到最大的n位数 void PrintNumbs(int n) { int nMax = 0; for (int i = 1;i <= n; i ++) { nMax = nMax*10 + 9; } for (int j = 1; j <= nMax; j ++) { cout << j << endl; } }
三 字符串模拟算法解法
解决这个问题需要表达一个大数。最常用也是最容易的方法是用字符串或者数组表达大数。该算法的步骤如下:
Step1.把字符串中的每一个数字都初始化为'0';
Step2.每一次为字符串表示的数字加1,再打印出来;
#include "stdio.h" #include <iostream> using namespace std; bool StructNumber(char *pNumber) { int nLen = strlen(pNumber); bool bOver = false; for (int i = nLen - 1; i >= 0; i --) { int nSum = pNumber[i] - '0'+ 1; if (nSum >= 10) { if (0 == i) { bOver = true; } else { nSum -= 10; pNumber[i]=nSum+'0'; } } else { pNumber[i] = nSum+'0'; break; } } return bOver; } void PrintCount_1(char *pNumber) { bool bIsBegin = true; int nLen = strlen(pNumber); for(int i =0;i < nLen; i ++) { if (bIsBegin && pNumber[i] != '0') { bIsBegin = false; } if (!bIsBegin) { cout << pNumber[i]; } } cout << " "; } void PrintCount(int n) { char *cNumber = new char[n+1]; memset(cNumber, '0', n); cNumber[n] = '\0'; int nLen = strlen(cNumber); while(!StructNumber(cNumber)) { PrintCount_1(cNumber); } delete[] cNumber; } void main() { PrintCount(3); return; }