您的位置:首页 > 其它

打印1到最大的n位数

2015-05-15 19:57 218 查看
题目:输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。

在不考虑大数的情况下,直接循环打印直到最大的数。

在考虑大数的情况下:

1.开辟n+1个空间的char型数组来保存数字,最后一位赋值为‘\0’,并且数字最高位对应数组的0下标;

2.构建函数bool Increment(char * number)实现数字的加1操作并且判断是否溢出;

3.循环调用Increment函数,溢出则终止循环,否则调用Print函数打印数字。

代码如下:

void printtomax(int n)
{
try
{
if(n<=0)
throw exception("参数不合法!n>0");
char *number=new char[n+1];

memset(number,'0',n*sizeof(char));//先初始化在给最后一位赋值‘\0’
number
='\0';
while(!Increment(number))//如果number加1之后没有溢出则打印该数字
{
Print(number);
}
delete[] number;
}
catch(exception e)
{
cerr<<e.what()<<endl;
}
}


实现加一操作的Increment函数:

1.分别用一个标志位(isoverflow)来控制是否溢出,另一个标志位(overstack)来控制是否有进位

2.给数字最低位加1之后,判断它的值是否大于10:

如果大于10,自己-=10,高一位+1,并继续判断高一位和10的大小,依次类推(注意判断当前位是否是最高位,是则溢出)

如果小于10,跳出循环函数返回true

代码如下:

//进行加1操作并判断是否溢出
bool Increment(char * number)
{
bool isoverflow=false;//判断是否溢出
int overstack=0;//进位标志
int length=strlen(number);//字符串的长度
for(int i=length-1;i>=0;i--)
{
int digit=number[i]-'0'+overstack;//获得当前位上的数字
//如果在个位的话就进行加一
if(i==length-1)
{
digit++;
}
//判断加一之后是否需要进位
if(digit>=10)
{
//如果当前位在最高位的话,溢出
if(i==0)
{
isoverflow=true;
break;
}
//没有溢出时候,进位标志赋值1,当前位-=10
else
{
overstack=1;
digit-=10;
number[i]='0'+digit;
continue;
}
}
//加1之后不需要进位,则直接跳出循环
else
{
number[i]='0'+digit;
break;
}

}
return isoverflow;
}


打印字符数组中数字的函数的实现(Print):

注意:数组前面是高位,后面是低位,为了区分前面的0还是数字本身的0(例如5位数组00101,前两个0不必打印,第三个0需要打印),需要这是一个标志位(beginprint)来区分

代码如下:

//打印number中存的数字
void Print(char * number)
{
bool beginprint=false;//区分是前面的0还是数字中的0,为true的话就一直打印下去
int length=strlen(number);
for(int i=0;i<length;i++)
{
if(number[i]!='0'&&(beginprint==false))//如果遇到第一个非0数则设置beginprint为true,开始打印
beginprint=true;
if(beginprint)
cout<<number[i];
}
cout<<"   ";
}


测试代码及运行结果:

int main()
{
printtomax(2);
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: