65.输出1到最大的N位数(运算)
题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,
则输出1、2、3一直到最大的3位数即999。
分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。
题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,
则输出1、2、3一直到最大的3位数即999。
分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。
#include<iostream>
#include<cassert>
using namespace std ;
void Print(char *s,int n)
{
assert(s!=NULL&&n>0);
bool flag=true;
for (int i=n-1;i>=0;i--)
{
assert(s[i]>='0'&&s[i]<='9');
if(s[i]=='0'&&flag)
continue;
else
flag=false;
cout<<s[i];
}
cout<<" ";
}
bool AddOne(char *s,int n)
{
assert(s!=NULL&&n>0&&s[0]>='0'&&s[0]<='9');
// cout<<"s[0]:"<<s[0]<<" n:"<<n<<endl;
if(s[0]>='0'&&s[0]<'9')
s[0]+=1;
else if(s[0]=='9')
{
s[0]='0';
if(n==1)
return false;
else
return AddOne(s+1,n-1);//don't foget to add 'return'
}
return true;
}
void InputOneToN(int n)
{
assert(n>0);
char *s=new char[n];
for(int i=0;i<n;i++)
s[i]='0';
while(AddOne(s,n))
Print(s,n);
}
int main()
{
int n=3;
InputOneToN(3);
return 1;
}
solution2
#include<iostream>
#include<cassert>
using namespace std ;
void Print(char *s,int n)
{
assert(s!=NULL&&n>0);
bool flag=true;
int i=0;
while (s[i]!='\0')
{
assert(s[i]>='0'&&s[i]<='9');
if(s[i]=='0'&&flag)
;
else
{
flag=false;
cout<<s[i];
}
i++;
}
cout<<" ";
}
void InPutOneToNRecursively(char *A,int n,int index)
{
if(index==n)
{
Print(A,n);
return;
}
for (int i=0;i<=9;i++)
{
A[index]='0'+i;
InPutOneToNRecursively(A,n,index+1);
}
}
void InputOneToN(int n)
{
assert(n>0);
char *s=new char[n+1];
memset(s,'0',n);
s[n]='\0';
InPutOneToNRecursively(s,n,0);
}
int main()
{
int n=3;
InputOneToN(n);
return 1;
}