打印从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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年03月30日 18时17分35秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
AcWing - 高精度减法(大数减法)
2019-04-28
AcWing - 高精度乘法(大数乘法)
2019-04-28
AcWing - 高精度除法(大数除法)
2019-04-28
AcWing - 前缀和(前缀和)
2019-04-28
AcWing - 子矩阵的和(二维前缀和)
2019-04-28
AcWing - 差分(一维差分)
2019-04-28
AcWing - 最长连续不重复子序列(双指针)
2019-04-28
AcWing - 数组元素的目标和(双指针)
2019-04-28
AcWing - 区间和(离散化&前缀和)
2019-04-28
AcWing - 区间合并(贪心)
2019-04-28
AcWing - 单链表(模拟)
2019-04-28
AcWing - 双链表(模拟)
2019-04-28
AcWing - KMP字符串(KMP)
2019-04-28
来一个总结吧
2019-04-28
有趣的句子
2019-04-28
每天一道 python 面试题 - Python中的元类(metaclass) 详细版本
2019-04-28
Scrapy(6)Item loader 加载器详解
2019-04-28
每日一道python面试题 - Python的实例,类和静态方法揭秘
2019-04-28
今日金融词汇---新股新债前面的N,是什么?
2019-04-28
每日一道python面试题 - Python的实例,类和静态方法揭秘
2019-04-28