攻城狮凌风

每天一道算法题(15)——打印1到最大的n位数

题目

            打印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;
}





     





posted on 2015-06-25 15:52  攻城狮凌风  阅读(201)  评论(0编辑  收藏  举报

导航