题目:
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数,即999.
思路:
由于这题没有说不考虑大数,因此我们有必要用字符串来表示大数。
用字符串表示最大的数没问题,关键是如何打印出所有数呢?
#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <algorithm>
using namespace std;void printString(vector<char> str, int n)
{int i = 0;while (i < n&&str[i] == '0') i++;for (; i < n; i++)cout << str[i];cout << " ";
}bool strNumIncrement(vector<char> &str, int n)
{bool isOverFlow = false;int carry = 0;for (int i = n - 1; i >= 0; i--){int sum = str[i] + carry - '0';if (i == n - 1) sum++; //加1操作if (sum >= 10){if (i == 0) isOverFlow = 1; else{carry = 1;sum = sum % 10;str[i] = sum + '0';}}else{str[i] = sum + '0';break;}}return isOverFlow;
}void print(int n)
{vector<char> strNum(n, '0');while (!strNumIncrement(strNum, n)){printString(strNum, n);}cout << endl;
}int main()
{print(5);return 0;
}
注意上面对strNum加一的操作。
由于是输出n位十进制,其实就是对其每一位从0到9进行全排列,然后不输出0。
#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <algorithm>
using namespace std;void printString(vector<char> str, int n)
{int i = 0;while (i < n&&str[i] == '0') i++;for (; i < n; i++)cout << str[i];cout << " ";
}void recursively(vector<char> &str, int index, int n)
{if (index == n){printString(str, n);return;}for (int i = 0; i < 10; i++){str[index] = i + '0';recursively(str, index + 1, n);}
}void print(int n)
{vector<char> strNum(n, '0');recursively(strNum, 0, n);cout << endl;
}int main()
{print(3);return 0;
}