题目:
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
由于计算机存储的数字有范围,需要使用字符串来进行模拟。
- 解法一:模拟法
模拟数位相加,需要处理进位的情况,
代码:
#include "pch.h"
#include <iostream>
using namespace std;
bool increment(char* num, int n) {
int oneNum = num[n - 1] - '0';
if (oneNum != 9) {
num[n - 1] += 1;
} else {
n--;
while (n>=0&&num[n] == '9') {
num[n--] = '0';
}
if (n == -1)
return false;
else {
num[n] += 1;
}
}
return true;
}
void printStrNum(char* num) {
int i = 0;
while (num[i] == '0') {
i++;
}
while (num[i] != '\0') {
cout << num[i];
i++;
}
cout << ' ';
}
void printOneToMaxN(int n) {
if (n <= 0)return;
char *num = new char[n+1];
memset(num, '0', n);
num[n] = '\0';
while (increment(num, n)) {
printStrNum(num);
}
delete[] num;
}
int main() {
printOneToMaxN(3);
}
- 解法二:递归全排列(优)
从高位到地位逐步递归排列
递归到个位遍输出该数字
递归可以用在全排列上(如果for循环则为O(n^3))
#include "pch.h"
#include <iostream>
using namespace std;
void printStrNum(char* num) {
int i = 0;
while (num[i] == '0') i++;
while (num[i] != '\0') {
cout << num[i];
i++;
}
cout << ' ';
}
//定了num[index]的数字,排列index后的位继续递归
void permutation(char* num, int n, int index) {
if (index == n) {
printStrNum(num);
return;
}
for (int i = 0; i < 10; i++) {
num[index] = i + '0';
permutation(num, n, index + 1);
}
}
void printOneToMaxN(int n) {
if (n <= 0)return;
char* num = new char[n + 1];
memset(num, '0', n);
num[n] = '\0';
permutation(num, n,0);
delete[] num;
}
int main() {
printOneToMaxN(3);
}