打印1到最大的N位数

输入数字n,顺序打印出从1到最大N位的十进制数。如输入3,则打印1,2,3到999.

这里设计一个大数问题,如果能很大,大到long long都会溢出,那么改怎么办。最常用的办法是用字符串或者数组来表达大数.

接下来一步步来实现。

首先解决打印问题,我们用字符串来表示数字,那么假如存着001,002那么我们是要处理前面的0的。

void PrintNumber(char* number)
{
    bool isBeginning0 = true;

    int length = strlen(number);

    for(int i = 0; i < length; ++i)
    {
        if( isBeginning0 && number[i] == '0')
        {
            isBeginning0 = false;
            continue;
        }
        cout<<number[i];
    }
    cout<<endl;
}

解决了打印问题,现在就是实现数字的递增。如何判断数字什么时候到达最大呢,可以判断数字的最高位是否产生了进位。

bool Increment(char* number)
{
    bool isOverflow = false;//用来表示数字是否到达最大。
    int nTakeOver = 0 ;  //用来表示是否产生进位
    int length = strlen(number);

    for(int i =length-1; i >= 0 ; --i)
    {
        int sum = number[i]-'0' +nTakeOver;
        //只有处理个位数时才加一;
        if( i == length -1 )
            sum++;
        
        if( sum >=10)//要产生进位了
        {
            if( i ==0 )//在最高位产生进位
            {
                isOverflow = true;
            }
            else //其他位置产生进位
            {
                sum -=10;
                nTakeOver = 1;
                number[i] = '0' + sum;
            }
        }
        else
        {
            number[i] = '0' +sum;
            break; //如果没有产生进位,停止循环。
        }
    }

    return isOverflow;
}

这样主要功能就完成了,组装下:

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;
}

 

 

posted @ 2013-03-03 14:25  没离开过  阅读(182)  评论(0)    收藏  举报