博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每天一道算法题(15)——打印1到最大的n位数
阅读量:6149 次
发布时间:2019-06-21

本文共 1491 字,大约阅读时间需要 4 分钟。

题目

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

<

     

转载于:https://www.cnblogs.com/engineerLF/p/5393024.html

你可能感兴趣的文章
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
淘宝的几个架构图
查看>>
Android扩展 - 拍照篇(Camera)
查看>>
数据加密插件
查看>>
linux后台运行程序
查看>>
win7 vs2012/2013 编译boost 1.55
查看>>
IIS7如何显示详细错误信息
查看>>
Android打包常见错误之Export aborted because fatal lint errors were found
查看>>
Tar打包、压缩与解压缩到指定目录的方法
查看>>
配置spring上下文
查看>>
Python异步IO --- 轻松管理10k+并发连接
查看>>
Oracle中drop user和drop user cascade的区别
查看>>
登记申请汇总
查看>>
Office WORD如何取消开始工作右侧栏
查看>>
Android Jni调用浅述
查看>>
CodeCombat森林关卡Python代码
查看>>
第一个应用程序HelloWorld
查看>>
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Java并发编程73道面试题及答案
查看>>