首页 > 代码库 > 打印1到最大的N位数
打印1到最大的N位数
问题描述:
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3打印出1-999.
思路分析:
最简单的想法莫过于先算出这个最大的数,然后循环打出,但是没有考虑大溢出和大数问题。
下面有两种思路,一个是用数组模拟字符串,一种是用排列组合的方法。
参考代码:
思路一:字符串上模拟数字加法
bool Increment(char *number)//实现在数字字符串上+1
{
bool isOveflow = false;//判断最高位时候溢出
int nTakeover = 0;//保存进位
int nLength = strlen(number);
for (int i = nLength-1;i >= 0;i--)
{
int nSum = number[i]-‘0‘+nTakeover;
if (i == nLength-1)//最低位
{
nSum++;
}
if (nSum >= 10)
{
if (i == 0)
{
isOveflow = true;
}
else
{
nSum -=10;
nTakeover = 1;
number[i] = nSum+‘0‘;
}
}
else
{
number[i] = nSum+‘0‘;
break;
}
}
return isOveflow;
}
void PrintNumber(char *number)
{
int nLength = strlen(number);
int isZero = true;
for (int i = 0; i < nLength;i++)
{
if (isZero && (number[i] != ‘0‘))//从高位开始,找到第一个非0数后将标志设为false
{
isZero = false;
}
if (!isZero)
{
cout<<number[i];
}
}
cout<<endl;
}
void Print1ToMaxNDigits(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;
number = NULL;
}
思路二:将问题转换为数字排列的方法
void Print1ToMaxNDigits2(int n)
{
if (n < 0)
{
return ;
}
char *number = new char[n+1];
memset(number,‘0‘,n);
number[n] = ‘\0‘;
Print1ToMaxNDigitsRecur(number,n,0);
delete [] number;
number = NULL;
}
void Print1ToMaxNDigitsRecur(char *number,int nLength,int nIndex)
{
if (nIndex == nLength)//已经排列到了最后一位就打印
{
PrintNumber(number);
return;
}
for (int i = 0;i < 10;i++)
{
number[nIndex] = i+‘0‘;
Print1ToMaxNDigitsRecur(number,nLength,nIndex+1);
}
}
打印1到最大的N位数