打印1到最大的n位数

Posted wanglelelihuanhuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打印1到最大的n位数相关的知识,希望对你有一定的参考价值。

题目:输入数字n,按顺序打印出从1到最大的n位十进制数。例如,输入3,打印1、2、3......999。

首先我们要考虑大数问题,接下来我们可以用字符串解决大数问题。

解法一:在字符串上模拟数字加法

思路:1、因为数字最大是n位,所以new一个长度为n+1的字符串,字符串最后一位是'\\0'。数字不够n位,在字符串前面补0。

           2、把字符串中的每一个数字都初始化为'0',然后在字符串表达的数字上模拟加法,最后把字符串表示的数字打印出来。

#include<iostream>
using namespace std;
void Printf(char* num)

	bool isBegin0 = true;
	int len = strlen(num);
	for (int i = 0; i < len ; ++i)
	
		if (isBegin0 && num[i] != '0')
			isBegin0 = false;
		//碰到第一个非0的字符才打印
		if (!isBegin0)
			printf("%c", num[i]);
	
	printf("\\t");

//在表示数字的字符串上加1
bool Incement(char* num)

	int step = 0;
	bool isOverflow = false;
	int len = strlen(num);
	for (int i = len - 1; i >= 0; --i)
	
		int sum = num[i] - '0' + step;
		if (i == len - 1)
			sum++;
		if (sum >= 10)
		
			if (i == 0)
				isOverflow = true;
			else
				sum -= 10;
				step = 1;
				num[i] = '0' + sum;
		
		else
		
			num[i] = '0' + sum;
			break;
		
	
	return isOverflow;

void PrintfNumber(int n)

	if (n <= 0)
		return;
	char* num = new char[n + 1];//new一个长度为n+1的字符串
	memset(num,'0',n);//字符串中的每一个数字都初始化为'0'
	num[n] = '\\0';

	//在字符串表达的数字上模拟加法
	while (!Incement(num))
	
		Printf(num);
	
	delete[] num;

int main()

	PrintfNumber(3);
	return 0;

解法二:数字全排列

我们把数字的每一位从0到9排列一遍,就得到了所有的十进制数。全排列可以采用递归实现,递归结束的条件是设置了数字的最后一位。

#include<iostream>
using namespace std;
void Printf(char* num)

	bool isBegin0 = true;
	int len = strlen(num);

	for (int i = 0; i < len; ++i)
	
		if (isBegin0 && num[i] != '0')
			isBegin0 = false;

		if (!isBegin0)
			printf("%c",num[i]);
	
	printf("\\t");

void PrintfNR(char* num, int len, int index)

	if (index == len - 1)//数字的最后一位
	
		Printf(num);
		return;
	
	//递归设置数字的每一位,直到数字的最后一位	
	for (int i = 0; i < 10; ++i)
	
		num[index + 1] = '0' + i;
		PrintfNR(num,len,index+1);
	

void PrintfNumber(int n)

	if (n <= 0)
		return;

	char* num = new char[n + 1];
	num[n] = '\\0';

	for (int i = 0; i < 10; ++i)
	
		num[0] = '0' + i;
		PrintfNR(num,n,0);
	
	delete[] num;

int main()

	PrintfNumber(3);
	return 0;



 

以上是关于打印1到最大的n位数的主要内容,如果未能解决你的问题,请参考以下文章

打印1到最大的n位数

打印1到最大的n位数

每日一练:打印从1到最大的n位数

打印1到最大的n位数

剑指 Offer 17. 打印从1到最大的n位数

12:打印 1 到最大的 n 位数