您的位置:首页 > Web前端

剑指Offer12打印1到最大的n位数

2014-08-15 21:34 225 查看
题目:

输入一个数字n,按顺序打印出从1最大的n位十进制数。比如输入3,打印出1,2,3,一直到最大的3位数即999.

注意陷阱:n位数,可能是int型盛不下的数,所以需要用大数来模拟。

有两种方法,一种就是大数模拟,每次加1,然后输出。

还有一中就是利用全排列,把其想成n位数的全排列,每一位数是从0到9的全排列。

方法1

void Print1ToLastDigist(int n)
{
if (n<0)
return ;
char *num = new char
;
memset(num,'0',n);
num
= '\0';
while(!Increment(num))
PrintNum(num);
}


Increament(num)这个函数就是控制每次加1的,但是有一个问题,就是咱们需要判断是否到达了最大n位数,最先想到的就是逐个位置进行比较,但是这样的时间复杂度就太高了,所以在Increament()函数中进行了处理,就是只有当最高位得到进位的时候才返回一个true,这样就不需要打印了

bool Increment(char *num)
{
bool IsOverFlover = false;
int TakeOver = 0;
int nlength = strlen(num);
for(int i= nlength-1;i>= 0;i--)
{
int sum = num[i]-'0'+TakeOver;
if(i == nlength-1)
sum++;
if(sum >= 10)
{
TakeOver = 1;
if(i==0)
IsOverFlover = true;
else
{
sum = sum - 10;
num[i] = sum + '0';
}
}
else
{
num[i] = '0'+sum;
break;
}
}
return IsOverFlover;
}
然后是输出函数,这里需要说明的是如果高位是0的话,就不用输出了,只从第一个不是0的数开始往外输出

方法2代码:

void PrintNum(char *num)
{
int nlength = strlen(num);
int i;
for(i=0;i<=nlength-1;i++)
{
if(num[i] != '0')
break;
}
for(;i<=nlength-1;i++)
cout<<num[i];
cout<<"\t";
}


void Print1ToMaxOfN(char *num,int length,int index)
{
if(index == length-1)
{
PrintNum(num);
return ;
}
for(int i=0;i<10;i++)
{
num[index + 1] = i + '0';
Print1ToMaxOfN(num,length,index+1);
}
}
void Print1ToLastDigistFangFa2(int n)
{
if(n<0)
return ;
char *num = new char
;
num
= '\0';

for(int i=0;i<10;i++)
{
num[0] = i + '0';
Print1ToMaxOfN(num,n,0);
}
delete []num;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: