/****************************************************** 题目:输入数字n,按顺序打印出从1最大的n位十进制。比如输 入3,则打印出1,2,3,4一直到3位数最大值999。 ******************************************************/ /*分析: 这个题目需要考虑大数问题。也就是如果我们输入的n值比较大, 比如n=100,那么将会超出所有整形所能表示的范围(不论是int还是 long)。 解决办法: 在字符串解决大数问题 */ #include<stdio.h> #include<string.h> void printNumber(char* number); /* //实现方法1 bool increment(char* number); void print1ToMaxOfNDigital(int n) { if(n<=0) return; char* number = new char[n+1]; memset(number,‘0‘,n); number[n] = ‘\0‘; while(!increment(number)) //increment函数用来使字符串表示的数字自增 { printNumber(number); //用来输出字符来代替数字 } delete[] number; } //实现字符自增,模拟数字自增 bool increment(char* number) { bool isOverFlow = false; //如果超过范围,溢出 int nTakeOver = 0; //超过10,进位 int nLength = strlen(number); //字符串长度,也就是位数n for(int i=nLength-1; i>=0; --i) { int nSum = number[i]-‘0‘+nTakeOver; if(i == nLength-1) nSum++; if(nSum>=10) //如果某一位上的数大于10 { if(i == 0) //如果在字符串的最低位,也就是数字上的最高位 isOverFlow = true; //超出范围 else { nTakeOver = 1; //进位 nSum -= 10; number[i] = ‘0‘+nSum; //将超过10的这一位减去10 } } else { number[i] = ‘0‘ + nSum; //设置位上的数值 break; } } return isOverFlow; } */ //实现方法2,以上方法虽然能够实现基本功能,但编程思路落实不易 //下面采用将问题转换为数字全排列的解法 void print1ToMaxOfNDigitsRecursively(char* number, int length, int index); void print1ToMaxOfNDigital(int n) { if(n<=0) return; char* number = new char[n+1]; number[n] = ‘\0‘; for(int i=0; i<10; ++i) { number[0] = ‘0‘+i; //数字表示最高位 print1ToMaxOfNDigitsRecursively(number,n,0); } delete[] number; } void print1ToMaxOfNDigitsRecursively(char* number, int length, int index) { if(index == length-1) { printNumber(number); return; } for(int i=0; i<10; i++) { number[index + 1] = ‘0‘ + i; print1ToMaxOfNDigitsRecursively(number,length,index+1); } } //打印数字,防止高位为0是也打印出来 void printNumber(char* number) { bool isBeginning0 = true; int nLength = strlen(number); for(int i=0; i<nLength; ++i) { if(isBeginning0 && number[i]!=‘0‘) //从字符串最低位开始寻找第一个不是‘0’的位置 isBeginning0 = false; if(!isBeginning0) //如果不以‘0’开头,则打印 printf("%c",number[i]); } printf("\t"); } int main() { print1ToMaxOfNDigital(3); }总结:
我们应该怎么处理?
==参考剑指offer
打印1到最大的n位数(大数问题),布布扣,bubuko.com
原文:http://blog.csdn.net/walkerkalr/article/details/20627181