这道题是面试过可能会遇到的手写代码题。如n为3时,那么需要打印1到999。需要注意的是当输入的n很大时,最大的n位数是不能通过int或者long long int来表示,此时可以使用字符数组来存储。

思路一:
1到n位最大数值采用字符数组存储。数值的高位存储在字符数组的低地址位。

#include <string.h>#include <iostream>
using namespace std;//利用case语句使字符++
char CharPlus(char a)
{  char b;  switch ( a )  {  case '0': b = '1';  break;  case '1': b = '2';  break;  case '2': b = '3';  break;  case '3': b = '4';  break;  case '4': b = '5';  break;  case '5': b = '6';  break;  case '6': b = '7';  break;  case '7': b = '8';  break;  case '8': b = '9';  break;  case '9': b = '0';  break;  default:  cout<<"error"<<endl;  }  return b;
}  bool Increment(char* numchar,int len)
{  bool flag = false;  if ( numchar[0] == '9' )                        //用于判断越界情况处理      flag=true;for (len = len-1; len >= 0; len-- )             //从数字低位开始更新{  numchar[len] = CharPlus( numchar[len] );    //更新该位上的数字  if ( numchar[len] != '0' )                  //判断是否向高位进位,如果该为由9->0,则向高位进位break;  if ( flag && numchar[0]=='0' )              //数值最高位从'9'变为'0'时,数值溢出,结束递增return false;  }  return true;
}  //打印输出时,要符合一般习惯,把前面的0去掉,从左开始打印
void PrintNum(char* numchar){  int i = 0;  bool flag = false;  while(numchar[i++] == '0');//找到数值从高位到低位第一个不为'0'的位置--i;  while ( numchar[i] != '\0' ){  cout<<numchar[i]; i++;  }  cout<<endl;
}  void Print1ToMaxOfNDigits(int n){  if ( n <= 0 ){  cout<<n<<" is illegal"<<endl;  return;  }char * numchar = new char[n+1];  memset( numchar,'0',sizeof(char)*(n+1) );         numchar[n] = '\0';                  //先对字符串数组初始化  while ( Increment(numchar,n) )      //字符串数组++,如果已经是最大则返回false  {  PrintNum(numchar);              //打印出该数字  }  delete[] numchar;
}  int main(){Print1ToMaxOfNDigits(1);
}

这种做法便于理解,但是代码却有点冗长。要在面试短短几十分钟内写完整,确实有点难度。这锻炼了考生的耐心程度。一般面试时,写的代码都不会很长,大概50行左右。因此,我们可以换思路去考虑问题。

思路二:
换思路,n位所有十进制数其实就是n个0-9的数全排列的过程,只是排在前面的0我们不打印出来。

全排列可以用递归去写,递归结束条件是我们已经设置了数字的最后一位。

void Print1ToMaxOfNDigitsRecursively(char* numchar, int length, int index)
{  if ( index == length -1)  {  PrintNum(numchar);  return;  }  for ( int i = 0; i < 10; i++ )  {  numchar[index+1] = i +'0';  Print1ToMaxOfNDigitsRecursively(numchar, length, index+1);  }  }
void Print1ToMaxOfNDigits(int n)
{  if ( n <= 0 )  {  cout<<n<<" is illegal"<<endl;  return;  }  char * numchar = new char[n+1];  numchar[n] = '\0';                  //先对字符串数组初始化  for ( int i = 0; i < 10; i++ )  {  numchar[0] = i + '0';  Print1ToMaxOfNDigitsRecursively(numchar,n,0);  }  delete[] numchar;
}  

测试用例
功能测试(输入1、2、3……)

特殊输入测试(输入-1,0)。

考点:
考查解决大数问题的能力;
时间空间复杂度尽可能好;
能否用递归做。

总结:
如果面试题是关于n位的整数并且没有限定n的取值范围,或者是输入任意大小的整数,那么这个题目很有可能是需要考虑大数问题。字符串是一个简单、有效的表示大数的方法。


参考文献

[1]http://blog.csdn.net/zhaojinjia/article/details/8776639.
[2]剑指offer.何海涛.电子工业出版社

打印1到最大的n位数相关推荐

  1. 【剑指offer-Java版】12打印1到最大的n位数

    打印1到最大的n位数:比较简单了,但是考虑n 很大的时候n位的最大999-9可能会超出表示范围 大数问题-需要使用字符串或者数组模拟大数加法 public class _Q12 {public voi ...

  2. java biginteger位数,Java之BigInteger(面试题12:打印1到最大的n位数)

    1.  以<剑指offer 名企面试官精讲典型编程题> - 面试题12:打印1到最大的n位数为例. 题目内容如下: 输入数字n,按顺序打印出从1到最大的n位十进制数. 比如输入3,则打印出 ...

  3. (补充)【打印1到最大的n位数】剑指offer——面试题12:打印1到最大的n位数

    剑指offer--面试题12:打印1到最大的n位数 此题在牛客网上没有OnlineJudge,在此补充两种做法. 参考网址:https://blog.csdn.net/yanxiaolx/articl ...

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

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

  5. Python 输入任意整数,打印输入的数字是几位数

        Python 输入任意整数,打印输入的数字是几位数   根据题目,这个比较简单,但有很多人会想的比较复杂,复杂在键盘输入0开始,后面接任意个零都可以,那么,比如,输入00024,这个输入是没有 ...

  6. 打印1到最大的n位数(Java)

    题目: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 第一思路: 首先计算出n位数的最大十进制数,然后利用循环输出从1到最大的n位数. ...

  7. 面试题12:打印1到最大的n位数

    题目描述 输入数字n,按顺序打印出1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 题目分析 剑指Offer(纪念版)P94 代码实现 void Print1ToMa ...

  8. 剑指offer面试题[12]-打印1到最大的n位数

    题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例. 对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1 ...

  9. 打印出数字字符串的偶位数

    #include <stdio.h> #pragma warning (disable:4996) void fun (long s, long t) { long sl = 10; s ...

最新文章

  1. TypeKit ,use online fonts
  2. The substring() Method in JDK 6 and JDK 7
  3. Zabbix的模板管理与配置
  4. vue Watcher分类 computed watch
  5. c++ map 修改value_干货 | 名企高频考点如何使用map统计字符串各个字符出现的次数...
  6. 网络编程懒人入门(六):史上最通俗的集线器、交换机、路由器功能原理入门
  7. PHP预防XSS攻击,ajax跨域攻击的方法
  8. 删除表空间联带数据文件
  9. 视觉slam十四讲ch6曲线拟合 代码注释(笔记版)
  10. 面试题11. 旋转数组的最小数字
  11. MySQL函数大全及用法
  12. form-making爬坑笔记(jeecg项目替换表单设计器)
  13. C语言 课程设计 实现简单的车辆管理系统
  14. 笔记本电脑上的以太网消失或者无法识别问题
  15. java调用kettle自定义kettle.properties配置文件路径
  16. 【opencv】viz 3D虚拟空间模块编译及使用
  17. layui实现管理后台页面效果
  18. Python测试框架之pytest详解
  19. 黑马程序员_Java_多线程
  20. matlab 莫比乌斯曲面,『Rhino实例.2』莫比乌斯曲面

热门文章

  1. 谷歌修复安卓蓝牙组件中无需用户交互的 bug
  2. 企业软件开发商 Atlassian 紧急修复不慎泄露的0day,IBM Aspera 软件或受影响
  3. 作业MathExam
  4. netfilter和iptables的实现机制
  5. vue.js+koa2项目实战(四)搭建koa2服务端
  6. 有关 !DOCTYPE HTML
  7. 魅族2016Java互联网方向其中一道笔试题--青蛙跳台阶问题
  8. 一道实用linux运维问题的9种shell解答方法!
  9. EasyNet.Solr 3.5.1发布及使用中的一些原则
  10. pb调用java webservice_PB调用各类WebService或c#程序