• 打印出从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

  • 相关阅读:
    flex 圣杯布局
    .net mvc里AutoMapper更为便捷的使用方法
    使用ClaimsIdentity来实现登录授权
    判断js中数据类型 的最短代码
    输入分钟、秒倒计时
    .net 导出Excel插件Npoi的使用
    seajs简单使用
    图片懒加载
    dropload上拉加载更多
    基于移动端的左滑删除
  • 原文地址:https://www.cnblogs.com/menghuizuotian/p/3776580.html
Copyright © 2020-2023  润新知