码迷,mamicode.com
首页 > 其他好文 > 详细

大数打印问题

时间:2020-03-04 20:52:38      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:using   space   print   pre   div   整数   std   很多   递归   

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

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

大数打印问题

标签:using   space   print   pre   div   整数   std   很多   递归   

原文地址:https://www.cnblogs.com/cry-star/p/12411903.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!