标签: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