打印出从1到最大的n位十进制数

首先这一题会溢出,要考虑的大数问题。所以不能用简单的是int类型数来表示(32位无符号int 范围是0x00000000···0xFFFFFFFF),下面主要是非递归的实现代码,自己做了注释方便以后回顾。

#include "stdafx.h"

#include <iostream>

using namespace std;

//输入数字n,按照顺序打印出从1到最大的n位十进制数。

bool Increament(char *number);

void printNumber(char *number);

void prin1ToMaxOfDIgits(int n)

{

    if(n<=0)

        return ;

    char *number=new char[n+1];//还包括'\0'

    memset(number,'0',n);

    number[n]='\0';



    while(!Increament(number))                 //每次while一次就打印一个数,如果不溢出就打印

    {

        printNumber(number);

    }

    delete []number;

}





bool Increament(char *number)

{

    bool isOverflow = false;                    

    int nTakeOver = 0;

    int nLength = strlen(number);

    

       for(int i = nLength - 1; i >= 0; i --)

    {

        int nSum = number[i]-'0'+ nTakeOver;     //ntakeOver相当于进1位(这是其他位加1的核心之所在),注意这里减了'0',取其增加量,如nsum=0,1,2,3...,不减'0'(48),

                                                         //下面无法判断   

        if(i == nLength - 1)

            nSum ++;                             //除了最低位是这样++,其他位都是按照进位的方式改变的,因为每次for循环会遍历        

        if(nSum >= 10)                           //只是发生在进位的时候,当发生进位,当前位前一位就增加一个nTakeOver=1

        {

            if(i==0)                             //如果是最左边的位,溢出(isOverflow= true)此时不能进位了

                isOverflow= true;

            else

            {

                nTakeOver=1;           //要进一位,也就是当前位的高一位会自动增加了一个1. 呼应nSum = number[i]-'0'+ nTakeOver,下次for循环i会-1,是当前位的高一位

                nSum=nSum-10;          //当前位增量恢复到0

                number[i] = nSum+'0';  //同时再转换到+'0'位置

            }

        }

        else

        {

            number[i] = nSum+'0';      //增量+'0'的位置

            break;

        }

    }

    return isOverflow;                 //返回溢出判断

}



void printNumber(char *number)

{

   bool isBeginning0=true;

   int nlength=strlen(number);



   for (int i=0;i<nlength;i++)

   { 

       if(isBeginning0 && number[i]!='0')  //从左往右,当碰到第一个非0字符的时候就从这里开始打印

           isBeginning0=false; 

       if(!isBeginning0)

           cout<<number[i]<<"  ";

   }

   cout<<endl;

}



void main()

{

   prin1ToMaxOfDIgits(2);

}

image

你可能感兴趣的:(十进制)