打印出从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];//还包括''
    memset(number,'0',n);
    number[n]='';

    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

原文地址:https://www.cnblogs.com/menghuizuotian/p/3776580.html