/******************************************************
题目:输入数字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