大数打印问题

Posted cry-star

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数打印问题相关的知识,希望对你有一定的参考价值。

来源于剑指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;
}

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

以上是关于大数打印问题的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

在 C++ 中乘以大数 - 有错误的代码?如何改进它? [关闭]

Java 剑指offer(16) 打印1到最大的n位数

打印从1到最大的n位数,考虑大数(Python and C++解法)

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

webstorm代码片段的创建