zoukankan      html  css  js  c++  java
  • 打印1到最大的n位数

    题目:输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。

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

    在考虑大数的情况下:

    1.开辟n+1个空间的char型数组来保存数字,最后一位赋值为‘’,并且数字最高位对应数组的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));//先初始化在给最后一位赋值‘’
            number[n]='';
            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;
    }

  • 相关阅读:
    P2319 [HNOI2006]超级英雄
    P4302 [SCOI2003]字符串折叠
    P1122 最大子树和
    HDU——2089 不要62
    P4555 最长双回文串
    P1463 [HAOI2007]反素数
    P2412 查单词
    P2787 语文1(chin1)- 理理思维
    P3078 [USACO13MAR]扑克牌型Poker Hands
    ubuntu中desktop与alternate版本的区别(转载)
  • 原文地址:https://www.cnblogs.com/runninglzw/p/4506736.html
Copyright © 2011-2022 走看看