微軟等100題 的第65題
題目:輸入數字n,按順序輸出從1最大的n位10進制數。比如輸入3,
則輸出1、2、3一直到最大的3位數即999。
分析:這是一道很有意思的題目。看起來很簡單,其實裏面卻有不少的玄機。
void printN(int n)
{
if(n <= 0) return;
int *p = new int[n];
memset(p, 0, sizeof(int)*n);
p[n-1] = 1;
int m = n-1;
while(m>=0)
{
m = n-1;
bool bp = false;
for(int i=0;i<n;i++)
{
if(p[i]>0) bp = true;
if(bp)
{
printf("%d", p[i]);
}
}
p[m]++;
printf(" ");
while(m>=0&&p[m]==10)
{
p[m] = 0;
m--;
if(m>=0)
p[m]++;
}
if(p[0]==9&&p[1]==9&&p[2]==9)
{
int a = 2;
}
}
delete []p;
}
int _tmain(int argc, _TCHAR* argv[])
{
printN(5);
return 0;
}
附:遞歸解法
int nS;
void Pri(int *p, int n, int m)
{
if(p[m]>0) nS = nS>m?m:nS;
if(m==n-1)
{
for(int j=nS;j<n;j++)
printf("%d", p[j]);
printf(" ");
}
else
{
for(int i=0;i<10;i++)
Pri(p, n, m+1);
}
p[m]++;
if(p[m]==10)
p[m] = 0;
}
void printN(int n)
{
if(n <= 0) return;
nS = n;
int *p = new int[n];
memset(p, 0, sizeof(int)*n);
//p[n-1] = 1;
for(int i=0;i<10;i++)
Pri(p, n, 0);
delete []p;
}