码迷,mamicode.com
首页 > 其他好文 > 详细

打印1到最大的n位数

时间:2015-05-15 21:07:58      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

题目:输入数字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[n]=\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;
}

技术分享

打印1到最大的n位数

标签:

原文地址:http://www.cnblogs.com/runninglzw/p/4506736.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!