记录来自《剑指offer》上的算法题。

题目如下:

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

第一种解法是比较容易想到,但是遇到大数问题的时候会有溢出的问题,其代码如下:

// 简单的解法,但遇到输入值很大时会出现问题
void Print1ToMaxOfNDigits_1(int n){int number = 1;int i = 0;while (i++ < n)number *= 10;for (i = 1; i < number; i++)cout << i << " ";cout << endl;
}

所以这里需要表达一个大数。最常用也是最容易的方法是用字符串或数组表达大数。下面使用字符串来表达大数。解法代码如下:

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;
}
// 打印用字符串表示的数字
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");
}// 利用字符串来表达大数
void Print1ToMaxOfNDigits_str(int n){if (n <= 0)return;// 初始化为'0'char *numbers = new char[n + 1];memset(numbers, '0', n);numbers[n] = '\0';while (!Increment(numbers)){PrintNumber(numbers);}delete[] numbers;
}
// 测试
int main(void){int t[] = { 0, 1, 3, -1 };for (int i = 0; i < 4; i++){cout << "test num=" << t[i] << ": \n";Print1ToMaxOfNDigits_str(t[i]);cout << endl;}system("pause");return 0;
}

这种解法中,函数Increment()实现在表示数字的字符串numbers上增加1,并判断是否出现溢出问题,也就是是否达到最大的n位数,而PrintNumber()函数则是打印出numbers

其中在函数Increment()中,每次增加1后快速判断是否到了最大的n位数的办法是判断第一个字符是否产生了进位,因为只有达到最大的n位数的情况才会对第一个字符(下标是0)进行进位,如n=3,只有对999再加1,才会对第一个字符进行进位,在函数中的体现就是在如下代码:

if (nSum >= 10){if (i == 0)isOverflow = true;....
}

这种解法思路比较直观,但是由于模拟了整数的加法,代码有点长,下面换另一种思路。如果我们在数字面前补0,可以发现n位所有十进制数其实就是n个从0到9的全排列。也就是说,我们把数字的每一位都从0到9排列一遍,就可以得到所有的十进制数。

全排列用递归很容易表达,数字的每一位都是0到9中的一位,然后设置下一个数。递归结束的条件是已经设置了数字的最后一位。代码如下:

// 递归方法
void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index){if (index == length - 1){PrintNumber(number);return;}for (int i = 0; i < 10; i++){number[index + 1] = i + '0';Print1ToMaxOfNDigitsRecursively(number, length, index + 1);}
}
// 利用字符串来表达大数
void Print1ToMaxOfNDigits_str(int n){if (n <= 0)return;// 初始化为'0'char *numbers = new char[n + 1];//memset(numbers, '0', n);numbers[n] = '\0';/*while (!Increment(numbers)){PrintNumber(numbers);}*/for (int i = 0; i < 10; ++i){numbers[0] = i + '0';Print1ToMaxOfNDigitsRecursively(numbers, n, 0);}delete[] numbers;
}

上述代码中注释掉的是第二种解法中的代码,然后增加适用于递归方法的代码。

更完整例子看出我的Github。

剑指offer--打印1到最大的n位数相关推荐

  1. 剑指offer_12_打印1到最大的n位数

    剑指offer_12_打印1到最大的n位数 题目:输入数字n,按顺序打印出1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 显然,这里面有一个小陷阱,当我们输入的n很 ...

  2. 【剑指offer】顺时针打印矩阵

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...

  3. 剑指offer:顺时针打印矩阵

    题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1 ...

  4. 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...

  5. 《LeetCode力扣练习》剑指 Offer 29. 顺时针打印矩阵 Java

    <LeetCode力扣练习>剑指 Offer 29. 顺时针打印矩阵 Java 一.资源 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matr ...

  6. 《LeetCode力扣练习》剑指 Offer 06. 从尾到头打印链表 Java

    <LeetCode力扣练习>剑指 Offer 06. 从尾到头打印链表 Java 一.资源 题目: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入: ...

  7. JAVA实现从尾到头打印链表(《剑指offer》)

    最近在刷<剑指offer>里的编程题,但是网上关于<剑指offer>的解答多半是C或者C++的,而且官方(作者)也是在用C++进行讲解,这里自己用java写了一些题目的解答代码 ...

  8. 【剑指Offer】从尾到头打印链表

    剑指Offer 从尾到头打印链表 题目描述 解法1 实现代码 一点补充 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解法1 这道题主要思路是while循环从头遍历整个列 ...

  9. 剑指Offer - 九度1511 - 从尾到头打印链表

    剑指Offer - 九度1511 - 从尾到头打印链表2013-11-29 21:08 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测试案 ...

  10. 剑指Offer #03 从尾到头打印链表(递归)

    题目来源:牛客网-剑指Offer专题 题目地址:从尾到头打印链表 题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 题目解析 方法一: 因为题目要求返回的顺序是从尾到头,所以我 ...

最新文章

  1. 时间较宽裕的时候,选择有挑战性的路
  2. python快速入门答案-Python 快速入门笔记(1):简介
  3. 错误 LINK : fatal error LNK1158: 无法运行“rc.exe”
  4. No authorization to log on as a Trusted System
  5. Pytest fixture之request传参
  6. Hashmasks将其艺术品与IPFS固定激励一起存储至Arweave中
  7. Android中BitmapFactory.Options详解
  8. VEGAS Pro 18序列号 PC上最佳的入门级视频编辑软件
  9. Android/IOS高仿微信IM源码
  10. 后台事务开发之简单示例
  11. 三维扫描仪[11]——总结并展望基于Kinect的三维扫描仪
  12. a+b / a-b / a*b / a/b c++问题题解
  13. 阿里云 RDS CPU性能优化
  14. React-Native强制关闭软键盘
  15. python 预测分析_如何用Python来预测分析离职率呢
  16. Windows利用系统自带的Dism命令挂载wim文件
  17. Swarm and shipyard
  18. 自然生长不含咖啡碱的茶树新品种--T三有机可可茶
  19. VMR7100/VMM7100 Typ-C/DP转HDMI2.1 8K设计方案|替代VMM7100/VMR7100芯片|GSV6201可完全替代兼容 VMM7100/VMR7100
  20. Python最简单的文字游戏——数字炸弹

热门文章

  1. html页面根据分辨率缩放,html2Canvas根据不同分辨率,生成pdf内容自适应
  2. mysql 列数据显示转成行数据显示_Mysql的列修改成行并显示数据的简单实现
  3. wordpress CAS
  4. MSP432P401R TI Drivers 库函数学习笔记(六)UART 串口
  5. laravel+vue开发环境搭建
  6. MAC OS X 10.9.X下用命令行开启SSD trim的方法汇总
  7. IIS出现The specified module could not be found解决方法
  8. React开发(217):vs code出现‘npm’
  9. 深入react技术栈(12):组件内通信
  10. React开发(177):opentab没有menu会报错