题目
输入数值n,按顺序打印从1到最大的n位数,例如输入n=3,则从1,2,3,一直打印到999
思路
若使用循环遍历 1- 999…9 并依次输出,当位数n过大时,无论将其存入int或long或long long都会溢出,故使用字符串来模拟数字加法
代码
#include<iostream>
#include<cstring>
using namespace std;
bool Increment(char*number)
{
bool isOverflow=false;//判断是否已经到最大的数了
int takeOver=0;//进位
int sum=0;//正在进行加法的那一位
int nlength=strlen(number);
for(int i=nlength-1;i>=0;i--)//从个位开始加。整个循环是一次加法运算,从个什百到最高
{
sum=number[i]-'0'+takeOver;//字符变数字。不是个位的就只看进位
if(i==nlength-1)//是个位就加一
sum++;
if(sum>=10)//进位的情况
{
if(i==0)//已经进到最高位了,说明已经到最大的数了
isOverflow=true;
else
{
takeOver=1;
sum-=10;
number[i]=sum+'0';
}
}
else//没有进位的情况
{
number[i]=sum+'0';
break;//不进位就个位加一就完成了
}
}
return isOverflow;
}
void PrintNumber(char*number)
{
int nlength=strlen(number);
int i=0;
for( i=0;i<nlength;i++)
{
if(number[i]!='0')
break;
}
for(;i<nlength;i++)
cout<<number[i];
cout<<'\t';
}
void Print1ToMaxOfNDigits(int n)
{
if(n<=0)
return;
char*number=new char[n+1];
memset(number,'0',n);
number[n]='\0';
while(!Increment(number))
PrintNumber(number);
delete[]number;
}
int main()
{
int n=3;
Print1ToMaxOfNDigits(n);
}