打印从1到最大的n位数 — C++实现
发布日期:2021-10-02 06:27:37 浏览次数:2 分类:技术文章

本文共 1949 字,大约阅读时间需要 6 分钟。

题目描述

输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的3位999。

盆友们首先想到的是for循环挨个输出,但是这样的话会有n过大,位数过高而造成溢出的情况

解题思路1:字符数组法

我们使用字符串来模拟数字,这样的话不管多少位我们都可以解决:

  • 构造字符数组:先构造一个n位,每一位都为'0'的数组,每次最后一位+1,重复这一过程到溢出为此(如2位,加到100就会溢出,因此输出1 ~ 99
  • 输出:前面有0的话不输出(如001,应输出1
#include 
#include
using namespace std;void print_arr(char *arr);bool over(char *arr);void print_number(int number){
char *arr=new char[number+1]; memset(arr,'0',number); arr[number]='\0'; while(!over(arr)){
print_arr(arr); }}void print_arr(char *arr){
//输出字符数组,第一个为0的话不输出 bool start=false; int count=0; while(!start){
if(arr[count]!='0')start=true; count++; } for(int i=count-1;i<=strlen(arr);i++) cout<
=0;i--){
//进1相加 arr[i]+=tmp; if(arr[i]-'0'>9){
arr[i]='0'; tmp=1; }else{
tmp=0; } } if(arr[0]=='0'&&tmp==1)return true;//判断溢出 return false;}int main(){
print_number(2); return 0;}

解题思路2:排列法

同样基于字符数组,每一位的数字都是从0~9之间不断变化,因此其是一个排列的问题,我们可以使用递归实现数组的排列,输出的规则同思路1:

#include 
#include
using namespace std;void print_arr(char *arr);void permutation(char *arr,int index);void print_number(int number){
char *arr=new char[number+1]; memset(arr,'0',number); arr[number]='\0'; for(int i=0;i<10;i++){
arr[0]=i+'0'; permutation(arr,0); }}void permutation(char *arr,int index){
//先递归凑足n位,然后排列输出 if(index==strlen(arr)-1){
print_arr(arr); return; } for(int i=0;i<10;i++){
arr[index+1]=i+'0'; permutation(arr,index+1); }}void print_arr(char *arr){
//输出字符数组,第一个为0的话不输出 bool start=false; int count=0; while(!start){
if(arr[count]!='0')start=true; count++; } for(int i=count-1;i<=strlen(arr);i++) cout<

PS:

该程序中使用了递归的方法来实现排列,因此位数较大时内存消耗过大,会发生-1073741571 (0xC00000FD)的错误

转载地址:https://blog.csdn.net/Jeaten/article/details/108110966 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:删除链表中重复的结点 — C++实现
下一篇:不用库函数实现计算一个数的n次方

发表评论

最新留言

不错!
[***.144.177.141]2024年03月30日 18时17分35秒