题目:输入数字N,按顺序打印出从1到最大的N位十进制数字。
首先需要考虑两点,
一是要考虑大数问题,遇到会溢出的数字仍能满足条件。
二是要满足,按照常规习惯,数字前面的0不输出。
实现:
#include "stdafx.h"
#include <memory>
//用来判断是否达到最大的N位数99^9,当达到的时候会产生最高位进位为1.该种情况返回true
bool Increment(char *number)
{
bool isOver=false;
int takeover=0;//进位标示符
int nLength = strlen(number);
for(int i = nLength-1;i>=0;i--)
{
int nSum = number[i]-'0'+takeover;
if(i==nLength-1)
nSum++;
if(nSum>=10)
{
if(i==0)
isOver=true;
else
{
nSum-=10;
takeover=1;
number[i]=nSum+'0';
}
}
else
{
number[i]=nSum+'0';
break;
}
}
return isOver;
}
void printNumber(char *number)
{
int i;
bool isBeginZero=true;
int nLength = strlen(number);
for(i=0;i<nLength;i++)
{
if(isBeginZero&& number[i]!='0')
isBeginZero=false;
if(!isBeginZero)
{
printf("%c",number[i]);
}
}
printf("\t");
}
void printToMaxOfDigits(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 printRecursively(char *number,int length,int index);
void printDigital_v2(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;
printRecursively(number,n,0);
}
delete [] number;
}
int main(int argc, char* argv[])
{
printToMaxOfDigits(3);
printf("Hello World!\n");
return 0;
}
void printRecursively(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';
printRecursively(number,length,index+1);
}
}