面试题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;
}