输入一个数n,输出从0到最大的n位数字。
测试用例:
0,1,-1,1000
#include<iostream>
#include<string.h>
using namespace std;
void printnum(char* num)
{
int i=0;
while(num[i]=='0')
i++;
for(int j=i;num[j]!='\0';j++)
cout<<num[j];
cout<<'\t';
}
/*错误写法
void printnum(char* num)
{
int len=strlen(num);
int sum=0;
for(int i=0;i<len;++i)
{
if(i==len-1)
sum+=num[i]-'0';
else
sum+=(num[i]-'0')*10;
}
cout<<sum<<' ';
}
*/
bool Increment(char* num)
{
bool f=false;
int len=strlen(num);
int ntakeover=0;//½øλ
for(int i=len-1;i>=0;--i)
{
int nSum=num[i]-'0'+ntakeover;
if(i==len-1)
nSum++;
if(nSum>=10)
{
if(i==0)
f=true;
else
{
ntakeover=1;
nSum-=10;
num[i]=nSum+'0';
}
}
else
{
num[i]=nSum+'0';
break;
}
}
return f;
}
void printnum1ton(int n)
{
if(n<=0)return;
char* num=new char[n+1];
memset(num,'0',n);
num[n]='\0';
while(!Increment(num))
{
printnum(num);
}
delete []num;
}
int main()
{
printnum1ton(3);
}
因为题目没有说明n的取值范围,所以要考虑到极大数,用类型变量保存数字就不合适了,需要用数组来模拟数字储存。分为两步,第一步,数字自增函数,每次加1;第二步,输出函数,输出数组表示的数字。要注意数组边界,memset函数赋初值时,从第一位到第n位,第n位不赋值。
另外,注意到这题其实就是0到n位数的全排列,所以可以用全排列来做,其中输出函数一样。代码如下:
#include<iostream>
#include<string.h>
using namespace std;
void printnum(char* num)
{
int i=0;
while(num[i]=='0')
i++;
for(int j=i;num[j]!='\0';j++)
cout<<num[j];
cout<<'\t';
}
void printCore(int t,char* num)
{
int len=strlen(num);
if(t==len)
{
printnum(num);
return;
}
for(int i=0;i<10;i++)
{
num[t]=i+'0';
printCore(t+1,num);
}
}
void printnum1ton(int n)
{
if(n<0)return;
char *num=new char[n+1];
memset(num,'0',n);
num[n+1]='\0';
int t=0;
for(int i=0;i<10;i++)
{
num[t]=i+'0';
printCore(t+1,num);
}
}
int main()
{
printnum1ton(3);
}