剑指Offer——面试题17:打印1到最大的n位数

面试题17:打印1到最大的n位数
题目:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
/**
 * 这道题目看似简单,很容易掉入陷阱,我们求最大的n位数是不是用整形(int)或者长整形(long long)
 *   都会溢出???我们需要考虑大数问题, 这是一个大陷阱...
 **/
void Print1ToMaxOfDigits1(int n) {
	int number=1, i=0;
	while(i++<n) {
		number*=10;
	}
	for(i=1; i<number; i++) printf("%d\t",i);
}

/**
 * 在字符串上模拟数字加法的解法:
 *     定义长度为 n+1 的字符串, 模拟加法  打印数字
 **/
bool Increment(char* number) {
	bool isOverflow=false;
	int nTakeOver=0;
	int nLength=strlen(number);
	for(int i=nLength-1; i>=0; i++) {
		int nSum=number[i]-'0'+nTakeOver;
		if(i==nLength-1) nSum++;
		if(nSum>=10) {
			if(i==0) isOverflow=true;
			else {
				nSum-=10;
				nTakeOver=1;
				number[i]=nSum+'0';
			}
		} else {
			number[i]=nSum+'0';
			break;
		}
	}
	return isOverflow;
}
void PrintNumber(char* number) {
	bool isBegining0=true;
	int nLength=strlen(number);

	for(int i=0; i<nLength; i++) {
		if(isBegining0 && number[i]!='0') isBegining0=false;
		if(!isBegining0) printf("%c",number[i]);
	}
	printf("\t");
}
void Print1ToMaxOfDigits2(int n) {
	if(n<=0) return;
	char* number = new char[n+1];
	memset(number, '0', n);
	number[n]='\0';
	while(!Increment(number)) PrintNumber(number);
	delete[] number;
}

/**
 * 把问题转换成数字排列的解法, 递归实现 
 **/
void Print1ToMaxOfDigitsRecursively(char* number, int length, int index) {
	if(index==length-1){
		PrintNumber(number);
		return ;
	}
	for(int i=0;i<10;i++){
		number[index+1]=i+'0';
		Print1ToMaxOfDigitsRecursively(number, length, index+1);
	}
} 
void Print1ToMaxOfDigits3(int n){
	if(n<=0) return;
	char* number = new char[n+1];
	number[n]='\0';
	
	for(int i=0;i<10;i++){
		number[0]=i+'0';
		Print1ToMaxOfDigitsRecursively(number, n, 0);
	}
	delete[] number;
}
int main() {
	Print1ToMaxOfDigits2(10);
	return 0;
}
发布了23 篇原创文章 · 获赞 24 · 访问量 570

猜你喜欢

转载自blog.csdn.net/qq_35340189/article/details/104384655