• 大数打印问题


    来源于剑指offer的大数打印问题:

    给定n,如何打印从1到最大的n位整数?

    如果n位整数不会溢出,例如n可以被long long表达,那可以简单的解决。如果n很大,无法用单个变量类型进行表达,那就要用其他数据类型来模拟大数的表达,最简单有效的方法是使用字符数组,并在字符数组上模拟整数的加法和进位。

    #include<iostream>
    #include<string.h>
    using namespace std;
    
    class Solution {
    public:
      void PrintNumber(int n){
        char* num = new char[n+1];
        memset(num, '0', n);   //将该段内存全部置为'0',初始化
        num[n] = '';
        while(!Increment(num)){
          Print(num);
        }
        return;
      }
    
      bool Increment(char* num){
        bool isOverflow = false;
        int len = strlen(num);
        int takeOver = 0;
        int thisSum = 0;
        for (int i=len-1;i>=0;i--){
          thisSum = num[i]-'0'+takeOver;
          if (i==len-1) thisSum++;     //如果是末位,要+1
          if (thisSum>=10){
            if (i==0) isOverflow = true;
            else {                         // 如果在i=0发生了进位,说明当前这个数字是溢出的数字,不必计算
              takeOver = 1;
              num[i] = thisSum%10+'0';
            }
          }
          else {
            num[i] = thisSum+'0';
            break; //如果忘记在这里break,会做很多不必要的循环
          }
        }
        return isOverflow;
      }
    
    
      void Print(char* num){
        int begin=0;
        int len = strlen(num);
        while(num[begin]=='0') begin++;
        if (begin==len) return;
        for (int i=begin;i<len;i++) cout<<num[i];
        cout<<endl;
      }
    };
    
    int main(){
      Solution s;
      s.PrintNumber(3);
      return 0;
    }

    此外该问题还可以用全排列的思想,结合递归方法来解决。下面给出全排列方法的c++代码

    #include<iostream>
    #include<string.h>
    using namespace std;
    
    class Solution {
    public:
      void PrintNumber(int n){
        char* num = new char[n+1];
        num[n] = '';
        for (int i=0;i<=9;i++){
          num[0] = i+'0';
          PrintNum(num, n, 1);
        }
        return;
      }
    
      void PrintNum(char* num, int length, int index){
        if (index==length){
          Print(num);
          return;
        }
        for (int i=0;i<=9;i++){
          num[index] = i+'0';
          PrintNum(num, length, index+1);
        }
      }
    
      void Print(char* num){
        int begin=0;
        int len = strlen(num);
        while(num[begin]=='0') begin++;
        if (begin==len) return;
        for (int i=begin;i<len;i++) cout<<num[i];
        cout<<endl;
      }
    };
    
    int main(){
      Solution s;
      s.PrintNumber(3);
      return 0;
    }

    打印是一类比较简单的问题,如果需要求大数的阶乘,还需要在字符数组上模拟乘法的进行。

  • 相关阅读:
    MOSS2007图片库的幻灯片视图在IE8标准渲染模式下的bug及其修正
    分享一个WM上绘制饼图、柱形图、折线图的控件类
    C# 中启动进程的三种方法
    SSCLI 包含了微软的CLI ,C#,JScript....的源码,学习.Net的不看怎么行
    (2)继承关系中的多态性编译时与运行时
    .NET.性能:装箱与拆箱、string stringBuilder、struct class、Add AddRangle等影响性能分析
    .NET.GC学习总结
    .NET.GC 浅谈.net托管程序中的资源释放问题 (转帖)
    (1)通过IL来看构造函数
    conda的使用
  • 原文地址:https://www.cnblogs.com/cry-star/p/12411903.html
Copyright © 2020-2023  润新知