首先这一题会溢出,要考虑的大数问题。所以不能用简单的是int类型数来表示(32位无符号int 范围是0x00000000···0xFFFFFFFF),下面主要是非递归的实现代码,自己做了注释方便以后回顾。
#include "stdafx.h"
#include <iostream>
using namespace std;
//输入数字n,按照顺序打印出从1到最大的n位十进制数。
bool Increament(char *number);
void printNumber(char *number);
void prin1ToMaxOfDIgits(int n)
{
if(n<=)
return ;
char *number=new char[n+];//还包括'\0'
memset(number,'',n);
number[n]='\0'; while(!Increament(number)) //每次while一次就打印一个数,如果不溢出就打印
{
printNumber(number);
}
delete []number;
} bool Increament(char *number)
{
bool isOverflow = false;
int nTakeOver = ;
int nLength = strlen(number); for(int i = nLength - ; i >= ; i --)
{
int nSum = number[i]-''+ nTakeOver; //ntakeOver相当于进1位(这是其他位加1的核心之所在),注意这里减了'0',取其增加量,如nsum=0,1,2,3...,不减'0'(48),
//下面无法判断
if(i == nLength - )
nSum ++; //除了最低位是这样++,其他位都是按照进位的方式改变的,因为每次for循环会遍历
if(nSum >= ) //只是发生在进位的时候,当发生进位,当前位前一位就增加一个nTakeOver=1
{
if(i==) //如果是最左边的位,溢出(isOverflow= true)此时不能进位了
isOverflow= true;
else
{
nTakeOver=; //要进一位,也就是当前位的高一位会自动增加了一个1. 呼应nSum = number[i]-'0'+ nTakeOver,下次for循环i会-1,是当前位的高一位
nSum=nSum-; //当前位增量恢复到0
number[i] = nSum+''; //同时再转换到+'0'位置
}
}
else
{
number[i] = nSum+''; //增量+'0'的位置
break;
}
}
return isOverflow; //返回溢出判断
} void printNumber(char *number)
{
bool isBeginning0=true;
int nlength=strlen(number); for (int i=;i<nlength;i++)
{
if(isBeginning0 && number[i]!='') //从左往右,当碰到第一个非0字符的时候就从这里开始打印
isBeginning0=false;
if(!isBeginning0)
cout<<number[i]<<" ";
}
cout<<endl;
} void main()
{
prin1ToMaxOfDIgits();
}