文章目录
题目描述
输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
题解思路
- 不假思索的解法
代码实现:
class Solution {
public:
vector<int> printNumbers(int n) {
int max = pow(10, n)-1;
vector<int> v(max);
for(int i = 0; i < max; i++) v[i] = i+1;
return v;
}
};
初看之下好像没有问题,但是其并没有考虑大数问题,有可能即使用整型(int)或长整型(long)都会溢出。
- 数组模拟运算的解法
最常用也是最容易的方法是用字符串或者数组表达大数。该算法的步骤如下:
- Step1.把数组 / 字符串中的每一个数字都初始化为’0’
- Step2.每一次为数组 / 字符串表示的数字加1,再打印出来
- Step3.打印的时候,需要注意将数字前的0去掉!!
代码实现:
bool increment(vector<char>& v){
bool flag = false;
int n = 0;
int len = v.size();
for(int i = len-1; i >= 0; --i){
int sum = v[i]-'0'+n;
if(i == len-1) sum++;
if(sum >= 10){
if(i == 0) flag = true;
else{
sum -= 10;
n = 1;
v[i] = '0'+sum;
}
}
else{
v[i] = '0'+sum;
break;
}
}
return flag;
}
void CoutNum(vector<char>& v){
bool flag = true;
int len = v.size();
for(int i = 0; i < len; ++i){
if(flag && v[i] != '0') flag = false;
if(!flag) cout << v[i];
}
cout << endl;
}
int main(){
int num;
while(cin >> num){
if(num <= 0){
cout << "输入有问题,请重新输入" << endl;
continue;
}
vector<char> v(num, '0');
while(!increment(v)){
CoutNum(v);
}
}
return 0;
}
代码生成图:
- 递归(数字排列)
如果可以在数字前面补0,就可以发现n位所有十进制其实就是n个从0到9的全排列 ~~~
代码实现:
void CoutNum(vector<char>& v){
bool flag = true;
int len = v.size();
for(int i = 0; i < len; ++i){
if(flag && v[i] != '0') flag = false;
if(!flag) cout << v[i];
}
cout << ' ';
}
void CoutDigitNum(vector<char> v, int len, int index){
if(index == len-1){
CoutNum(v);
return;
}
for(int i = 0; i < 10; ++i){
v[index+1] = i+'0';
CoutDigitNum(v, len, index+1);
}
}
int main(){
int num;
while(cin >> num){
if(num <= 0){
cout << "输入有问题,请重新输入" << endl;
continue;
}
vector<char> v(num, '0');
for(int i = 0; i < 10; ++i){
v[0] = i+'0';
CoutDigitNum(v, num, 0);
}
}
return 0;
}
如有不同见解,欢迎留言讨论~~~