大数打印问题

来源于剑指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] = '\0';
    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] = '\0';
    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;
}

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

posted @ 2020-03-04 20:21  RukiRuki  阅读(322)  评论(0编辑  收藏  举报