面试题12:打印1到最大的n位数
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1,2,3,一直到最大的三位数999。
首先这个题目看起来很简单。但是有很多陷阱,比如大数问题,如果n很大,我们考虑要不要用long long类型,再如果long long类型都不可以,我们该如何表示。
我的思路:
-
使用字符串来表示数字,这样我们就可以取无限大的n;
-
在字符串上模拟数字加法;
-
打印时将001变成1,去掉前面的零,符合我们的日常习惯。
我的代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<iostream>
usingnamespace std;
void Printf(char *number)
{
bool flag=false;//
for(int i=0; i<strlen(number);i++)
{
if(flag || number[i] != '0')//当第一个不为零的数进去后,
{ // flag就会变成真,后面进去的数
flag=true; //的数都会打印起来
printf("%c",number[i]);
}
}
printf("\n");
}
bool Increment(char *number)
{
int flag=false;
int flag2=0;//当等于Num==10的时候标记前一位应该加一
int length=strlen(number);
for(int i=length-1; i>= 0; i--)
{
int Num=number[i]-'0'+flag2;
if(i == length-1)//只修改最后一位数,当前一位需要
{ // 加一时,num不需要加一
Num+=1;
}
if(Num >= 10)
{
if(i==0)
{
flag=true;
break;
}
else
{
Num-=10;
flag2=1;
number[i]='0'+Num;
}
}
else
{
number[i]='0'+Num;
break;
}
}
return flag;
}
void Printf1_n(intn)
{
assert(n >0);
char *number=newchar[n+1];
memset(number,'0',n);
number[n]='\0';
while(! Increment(number))
{
Printf(number);
}
delete[]number;
}
int main()
{
Printf1_n(2);
//Printf1_n(3);
//Printf1_n(5);
return 0;
执行结果如下: