题目:
打印1到最大的n位数。如n=4,打印1-9999。
思路:
由于直接使用循环会导致int或者long long都不够存储。因此使用字符串来存储数据,这里涉及到数字转换成字符串以及字符串的加法。
代码:
1.使用递归思路。
可以认为。从高位到低位,高位数先固定,在此情况下,低位数依次调整。每一位涉及0-9调整,这里每一级的都要嵌套10次。
void printMax(char* number,const int index,const int size){//嵌套打印函数,size为总的位数
if(!number)
return ;
if(index==size){//嵌套截止条件
show(number);
return ;
}
for(int i=0;i<10;i++){
number[index]=i+'0';//index---当前调整的位数
printMax(number,index+1,size);
}
}
void print2(const int& n){//主函数
if(n<=0)
return ;
char* number=new char[n+1];
memset(number,'0',(n+1)*sizeof(char));number[n]='\0';
printMax(number,0,n);delete []number;
}
2.假设不使用递归思路
则单次循环是对上次循环产生的数的+1。即要模拟加法过程。这里使用了进位辅助数组,当最高位产生进位时,循环停止。
void increment(char* num,int size,int* add){//单次增1函数
if(!num||!add||size<=0)
return;
char* number=num+size-1;//从最后一位开始变化
for(int i=size-1;i>=0;i--){
if(*number-'0'+add[i+1]==10){//产生进位
*number='0';
add[i]=1;//存储进位
number--;//指针前移
}
else{
*number=*number+add[i+1];
add[i+1]=0;//删除进位信息
break;
}
}
}
void printMax(const int& n){//主函数
if(n<=0)
return;
char* num=new char[n+1];//数字存储字符串
int* add=new int[n+1];//进位辅助数组,代表当前是否产生进位
memset(num,'0',(n+1)*sizeof(char)); num[n]='\0';
memset(add,0,(n+1)*sizeof(int));
while(1){
add[n]=1;
increment(num,n,add);
if(add[0])//最高位产生进位,循环打印停止
break;
show(num);//打印数字
}
delete []num;
delete []add;
}
3.字符串打印函数
void show(const char* num){
const char* p=num;
while(*p=='0')
p++;
if(*p)//*p='\0'
cout<<p<<endl;
}