打印1到最大的N位数

来源:互联网 发布:路老膏方 常见网络骗 编辑:程序博客网 时间:2024/05/29 08:36

题意描述:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1、2、3……999

解题思路一:先找到最大的那个数字,然后再从1开始循环打印

void Print1ToMaxOfNDigits(int n) {int num = 1;int i = 0;while (i < n) {num *= 10;++i;}for (int i = 0; i < num; i++)cout << i << "\t";cout << endl;}
解题思路二:考虑到大数问题。就是当输入的n较大是时,int已满足不了需求,甚至Long都会溢出,大数问题一般采用字符串来表示,即字符的每一位都是'0'-'9'的字符。因此n位数字需要(n+1)长度
bool Increment(char * num) {bool isOverFlow = false;int nTakeOver = 0;int nLength = strlen(num);for (int i = nLength - 1; i >= 0; i--) {int nSum = num[i] - '0' + nTakeOver;if (i == nLength - 1)nSum++;if (nSum >= 10) {if (i == 0)isOverFlow = true;else {nSum -= 10;nTakeOver = 1;num[i] = '0' + nSum;}}else {num[i] = '0' + nSum;break;}}return isOverFlow;}void PrintNum(char* num) {bool isBeginning0 = true;int nLength = strlen(num);for (int i = 0; i < nLength; i++) {if (isBeginning0 && num[i] != '0')isBeginning0 = false;if (!isBeginning0)cout << num[i];}cout << endl;}void Print1ToMaxOfNDigits(int n) {if (n <= 0)return;char *num = new char[n + 1];memset(num, '0', n);//初始化为全0num[n] = '\n';while (!Increment(num))PrintNum(num);delete[] num;}
解题思路三:全排列 

void PrintNum(char* num) {bool isBeginning0 = true;int nLength = strlen(num);for (int i = 0; i < nLength; i++) {if (isBeginning0 && num[i] != '0')isBeginning0 = false;if (!isBeginning0)cout << num[i];}cout << endl;}void Print1ToMaxOfNDigitsRecursively(char* num, int length, int index) {if (index == length - 1) {PrintNum(num);return;}for (int i = 0; i < 10; i++) {num[index + 1] = i + '0';Print1ToMaxOfNDigitsRecursively(num, length, index + 1);}}void Print1ToMaxOfNDigits(int n) {if (n <= 0)return;char* num = new char[n + 1];num[n] = '\n';for (int i = 0; i < 10; i++) {num[0] = i + '0';Print1ToMaxOfNDigitsRecursively(num, n, 0);}delete[]num;}




0 0
原创粉丝点击