打印1到最大的n位数

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

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


解题思路:


1、求出3位数字的最大数,再逐个打印


问题是:不能打印大数,原因是定义的int或者long型有限。


void PrintToMaxOfDigits(int n)

{

int number = 1;

int i = 0;

while (i++ < n)

 number *= 10;

for (i = 1; i < number; ++i)

 cout << i << ", ";

}

2、使用字符串模拟加法(以解决大数问题)


1)3位,每一位代表一个0-9的字符。

2)最低位加1,逢10进1

3)最高位也即是第0位若产生进位位,则溢出标志置1

4)打印部分,上述每次累加1,则对于3位字符串,依次从高位打印到低位


需要注意的问题是若前面的高位部分若为0,则进行判断,高位部分无效的0不打印


参考代码:


void Print1ToMaxOfNDigits_1(int n)//打印部分

{

   if (n <= 0)

       return;

   char *number = new char[n + 1];

   memset(number, '0', n);//初始化函数

   number[n] = '\0';

   while (!Increment(number))

   {

       PrintNumber(number);

   }

   delete[]number;

}

// 字符串number表示一个数字,在 number上增加1

// 如果做加法溢出,则返回true;否则为false

bool Increment(char* number)

{

   bool isOverflow = false;

   int nTakeOver = 0;

   int nLength = strlen(number);

   for (int i = nLength - 1; i >= 0; i--)

   {

       int nSum = number[i] - '0' + nTakeOver;

       if (i == nLength - 1)

           nSum++;

       if (nSum >= 10)

       {

           if (i == 0)

               isOverflow = true;

           else

           {

               nSum -= 10;

               nTakeOver = 1;

               number[i] = '0' + nSum;

           }

       }

       else

       {

           number[i] = '0' + nSum;

           break;

       }

   }

   return isOverflow;

}

上述的length为打印的最大位数。 注意一个数累加完成则break出循环,若是产生进位则循环到没有进位产生。


3、使用递归的方法实现


思路:


1)3位数(012),每一位看成是0-9的位数,即是3个从0-9的全排列

2)从高位(0位)开始递归,然后是1位,再是2位。每一位递归10次 ,则总共是1000次

3)并在第1000次时结束递归,并依次从低位到高位依次返回,从001到002一直到999


参考代码


void Print1ToMaxOfDigits(int n)

{

if (n <= 0)

 return;

char* number = new char[n + 1];

number[n] = '\0';

for (int i = 0; i < 10; ++i)//递归1

{

 number[0] = i + '0';

 Print1ToMaxOfNDigitsRecursively(number, n, 0);

}

delete[] number;

}

void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index)

{

if (index == length - 1)

{

 PrintNumber(number);

 return;

}

for (int i = 0; i < 10; ++i)//递归2 这部分嵌套两次

{

 number[index + 1] = i + '0';

 Print1ToMaxOfNDigitsRecursively(number, length, index + 1);

}

}

void PrintNumber(char* number)//打印输出

{

bool isBeginning0 = true;

int nLength = strlen(number);

for (int i = 0; i < nLength; ++i)

{

 if (isBeginning0 && number[i] != '0')

  isBeginning0 = false;

 if (!isBeginning0)

 {

  printf("%c", number[i]);

 }

}

printf("\t");

}

参考:【1】https://blog.csdn.net/sinat_36161667/article/details/80786754


【2】剑指


后续问题:

2fbdf30cb4ef2568f3ec0462ab7ad177_20190211221150882.png

或者是两个没有定义大小的数相加(同样属于大数问题)


目录
相关文章
|
11月前
|
人工智能 自然语言处理 架构师
字节面试: es怎么提升性能和精准度?(尼恩独家,史上最全)
本文由40岁老架构师尼恩撰写,针对ES(Elasticsearch)提升搜索性能和精准度的面试题进行详细解析。文章首先指出,提升ES速度和精准度是两个独立的问题,分别涉及性能优化和精准度优化。这些内容不仅有助于应对面试中的难题,还能帮助开发者在实际项目中构建更高效的搜索系统。尼恩强调,掌握这些知识后可以在面试中“吊打”面试官,轻松获得理想Offer。同时,他还提供了《尼恩Java面试宝典PDF》等资源供读者学习参考。
|
机器学习/深度学习 数据可视化 自动驾驶
YOLO11-seg分割如何训练自己的数据集(道路缺陷)
本文介绍了如何使用自己的道路缺陷数据集训练YOLOv11-seg模型,涵盖数据集准备、模型配置、训练过程及结果可视化。数据集包含4029张图像,分为训练、验证和测试集。训练后,模型在Mask mAP50指标上达到0.673,展示了良好的分割性能。
5668 4
|
存储 Shell 网络安全
【vscode】在本地加载远端环境并开发
【vscode】在本地加载远端环境并开发
974 0
|
存储 算法
标定系列二、9点标定以及5点圆心标定过程(代码详解)
标定系列二、9点标定以及5点圆心标定过程(代码详解)
3032 0
|
存储 Java 关系型数据库
【Elasticsearch 技术分享】—— 十张图带大家看懂 ES 原理 !明白为什么说:ES 是准实时的!
说到 Elasticsearch ,其中最明显的一个特点就是 near real-time 准实时 —— 当文档存储在Elasticsearch中时,将在1秒内以几乎实时的方式对其进行索引和完全搜索。那为什么说 ES 是准实时的呢?
1640 0
SQL:union all和union的区别 和使用
SQL:union all和union的区别 和使用
|
XML 开发框架 监控
面试题:springboot比spring有哪些优点?
面试题:springboot比spring有哪些优点?
512 0
|
算法 Java Go
ETCD(六)ETCD和Zookeeper
ETCD(六)ETCD和Zookeeper
403 0
|
弹性计算 虚拟化 异构计算
阿里云GPU服务器NVIDIA A100 GPU卡租用价格表
阿里云GPU服务器NVIDIA A100 GPU卡租用价格表,阿里云GPU服务器租用价格表包括包年包月价格、一个小时收费以及学生GPU服务器租用费用,阿里云GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡,GPU云服务器gn6i可享受3折优惠,阿里云百科分享阿里云GPU服务器租用价格表、GPU一个小时多少钱以及学生GPU服务器收费价格表
15777 0
阿里云GPU服务器NVIDIA A100 GPU卡租用价格表