首先这一题会溢出,要考虑的大数问题。所以不能用简单的是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<=0)
return ;
char *number=new char[n+1];//还包括‘\0‘
memset(number,‘0‘,n);
number[n]=‘\0‘;while(!Increament(number)) //每次while一次就打印一个数,如果不溢出就打印
{
printNumber(number);
}
delete []number;
}bool Increament(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; //ntakeOver相当于进1位(这是其他位加1的核心之所在),注意这里减了‘0‘,取其增加量,如nsum=0,1,2,3...,不减‘0‘(48),
//下面无法判断
if(i == nLength - 1)
nSum ++; //除了最低位是这样++,其他位都是按照进位的方式改变的,因为每次for循环会遍历
if(nSum >= 10) //只是发生在进位的时候,当发生进位,当前位前一位就增加一个nTakeOver=1
{
if(i==0) //如果是最左边的位,溢出(isOverflow= true)此时不能进位了
isOverflow= true;
else
{
nTakeOver=1; //要进一位,也就是当前位的高一位会自动增加了一个1. 呼应nSum = number[i]-‘0‘+ nTakeOver,下次for循环i会-1,是当前位的高一位
nSum=nSum-10; //当前位增量恢复到0
number[i] = nSum+‘0‘; //同时再转换到+‘0‘位置
}
}
else
{
number[i] = nSum+‘0‘; //增量+‘0‘的位置
break;
}
}
return isOverflow; //返回溢出判断
}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)
cout<<number[i]<<" ";
}
cout<<endl;
}void main()
{
prin1ToMaxOfDIgits(2);
}