算法习题65:输出1到最大的N位数

本文介绍三种方法实现输出从1到最大的N位数,包括直接法、加法模拟及递归实现加法累进。针对大数情况提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.输出 1 到最大的 N 位数
题目:输入数字 n,按顺序输出从 1 最大的 n 位 10 进制数。

比如输入 3,则输出 1、2、3 一直到最大的 3 位数即 999。

--------------------------------------------------

(1)第一种:直接法

这道题看起来还是比较简单的

void CountNum(int N){
	int max=0;
	while(N-->0)
		max = 10*max + 9;
	int i = 1;
	while(i<=max)
		cout<<i++<<endl;
}


(2)第二种:加法模拟
似乎这么不到十行就解决了,

不过大家可以考虑几个问题再改进改进。

如果输入的是20位,30位或者更大呢?

这时候我们用longlong都会溢出了,所以我们这里不能用常规的加法进行,可以用字符串来模拟加法运算

我们new char[N+1]个字节单元,最后一个放输出结束符号'\0'

那么我们每次对低位+1如果等于9了,那么就往前加一,模拟加法,这就不会有溢出现象了。

借用一个str表示当前计算到的最高位,每次从这里输出即可

void CountNum2(int N){
	char *str = new char[N+1];
	memset(str,'0',N);
	str[N]='\0';
	str[N-1]='1';

	char *end = str + N-1;
	char *count = end;//end表示个位数在的位置

	int n = N;
	bool isOver= false;//是否结束的标志
	str=count;//str记录了当前最高位的位置
	while(!isOver){
		cout<<str<<endl;
		while(!isOver && *count == '9'){
			//这里循环是往高位找到一个非9的才可以加1
			*count = '0';
			if(str==count){
				if(n>1){
					n--;
					str--;
					count--;
				}else
					isOver= true;
			}else
				count--;
		}
		//not 9
		(*count)++;
		count = end;
	}
}


(2)第三种:递归实现加法累进

其实上面加法模拟中我们发现低位一直在进行一个递归操作,即 ”当前位=9,向高位+1,且当前位=0,再从低位开始加法“


void CountNum3(int N){
	char *str = new char[N+1];
	memset(str,'0',N);

	str[N]='\0';
	Count(str,str,str+N-1);

}

void Count(char* p, char *str, char *end){
	if(p == end){
		while(*p < '9'){
			(*p)++;
			Print(str);
		}
		return;
	}
	while(*p <= '9'){
		*(p+1) = '0'-1;
		Count(p+1,str,end);
		(*p)++;
	}

}

void Print(char *str){
	while(*str == '0')
		str++;
	cout<<str<<endl;
}

输出结果如下:

1
1
2
3
4
5
6
7
8
9



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值