题目描述
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的3位999。
盆友们首先想到的是for
循环挨个输出,但是这样的话会有n
过大,位数过高而造成溢出的情况
解题思路1:字符数组法
我们使用字符串来模拟数字,这样的话不管多少位我们都可以解决:
- 构造字符数组:先构造一个
n
位,每一位都为'0'
的数组,每次最后一位+1
,重复这一过程到溢出为此(如2
位,加到100
就会溢出,因此输出1 ~ 99
) - 输出:前面有
0
的话不输出(如001
,应输出1
)
#include <iostream>
#include <string.h>
using namespace std;
void print_arr(char *arr);
bool over(char *arr);
void print_number(int number){
char *arr=new char[number+1];
memset(arr,'0',number);
arr[number]='\0';
while(!over(arr)){
print_arr(arr);
}
}
void print_arr(char *arr){//输出字符数组,第一个为0的话不输出
bool start=false;
int count=0;
while(!start){
if(arr[count]!='0')start=true;
count++;
}
for(int i=count-1;i<=strlen(arr);i++)
cout<<arr[i];
cout<<"\t";
}
bool over(char *arr){//数字加1操作
arr[strlen(arr)-1]++;
int tmp=0;
for(int i=strlen(arr)-1;i>=0;i--){//进1相加
arr[i]+=tmp;
if(arr[i]-'0'>9){
arr[i]='0';
tmp=1;
}else{
tmp=0;
}
}
if(arr[0]=='0'&&tmp==1)return true;//判断溢出
return false;
}
int main(){
print_number(2);
return 0;
}
解题思路2:排列法
同样基于字符数组,每一位的数字都是从0~9
之间不断变化,因此其是一个排列的问题,我们可以使用递归实现数组的排列,输出的规则同思路1:
#include <iostream>
#include <string.h>
using namespace std;
void print_arr(char *arr);
void permutation(char *arr,int index);
void print_number(int number){
char *arr=new char[number+1];
memset(arr,'0',number);
arr[number]='\0';
for(int i=0;i<10;i++){
arr[0]=i+'0';
permutation(arr,0);
}
}
void permutation(char *arr,int index){//先递归凑足n位,然后排列输出
if(index==strlen(arr)-1){
print_arr(arr);
return;
}
for(int i=0;i<10;i++){
arr[index+1]=i+'0';
permutation(arr,index+1);
}
}
void print_arr(char *arr){//输出字符数组,第一个为0的话不输出
bool start=false;
int count=0;
while(!start){
if(arr[count]!='0')start=true;
count++;
}
for(int i=count-1;i<=strlen(arr);i++)
cout<<arr[i];
cout<<"\t";
}
int main(){
print_number(2);
return 0;
}
PS:
该程序中使用了递归的方法来实现排列,因此位数较大时内存消耗过大,会发生-1073741571 (0xC00000FD)
的错误