看到《剑指offer》的第12题是用递归完成的,就想到应该可以用循环完成。
因为n可能很大,用long long都会溢出,所以应该考虑大数问题。对于大数可以用字符串和数字表达。
#include <iostream>
using namespace std;
void Print1ToMaxOfNDigits(int N)
{
if (N<=0)
{
cout<<"InvalidInput"<<endl;
return ;
}
char* arr=new char[N+2]; //多两个字符,第0位用于当哨兵,第N+1用于存储字符串结束符
for (int i=0;i<N+1;i++)
{
arr[i]='0';
}
arr[N+1]=NULL;
int index;
int count1=0;//count用于记入现在已经打印出来的数的位数,以免打印出数字前面的0
int count2=0;
while (arr[0]!='1')
{
index=N;
cout<<&arr[N-count1]<<endl;
++arr[N];
count2=0;
while (arr[index]=='9'+1)
{
arr[index]='0';
--index;
++arr[index];
++count2;
}
if (count2>count1)
{
count1=count2;
}
}
delete[] arr;
}
void main()
{
Print1ToMaxOfNDigits(2);
}