打印1到最大的n位数
这道题是面试过可能会遇到的手写代码题。如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位数相关推荐
- 【剑指offer-Java版】12打印1到最大的n位数
打印1到最大的n位数:比较简单了,但是考虑n 很大的时候n位的最大999-9可能会超出表示范围 大数问题-需要使用字符串或者数组模拟大数加法 public class _Q12 {public voi ...
- java biginteger位数,Java之BigInteger(面试题12:打印1到最大的n位数)
1. 以<剑指offer 名企面试官精讲典型编程题> - 面试题12:打印1到最大的n位数为例. 题目内容如下: 输入数字n,按顺序打印出从1到最大的n位十进制数. 比如输入3,则打印出 ...
- (补充)【打印1到最大的n位数】剑指offer——面试题12:打印1到最大的n位数
剑指offer--面试题12:打印1到最大的n位数 此题在牛客网上没有OnlineJudge,在此补充两种做法. 参考网址:https://blog.csdn.net/yanxiaolx/articl ...
- 剑指offer_12_打印1到最大的n位数
剑指offer_12_打印1到最大的n位数 题目:输入数字n,按顺序打印出1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 显然,这里面有一个小陷阱,当我们输入的n很 ...
- Python 输入任意整数,打印输入的数字是几位数
Python 输入任意整数,打印输入的数字是几位数 根据题目,这个比较简单,但有很多人会想的比较复杂,复杂在键盘输入0开始,后面接任意个零都可以,那么,比如,输入00024,这个输入是没有 ...
- 打印1到最大的n位数(Java)
题目: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 第一思路: 首先计算出n位数的最大十进制数,然后利用循环输出从1到最大的n位数. ...
- 面试题12:打印1到最大的n位数
题目描述 输入数字n,按顺序打印出1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 题目分析 剑指Offer(纪念版)P94 代码实现 void Print1ToMa ...
- 剑指offer面试题[12]-打印1到最大的n位数
题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例. 对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1 ...
- 打印出数字字符串的偶位数
#include <stdio.h> #pragma warning (disable:4996) void fun (long s, long t) { long sl = 10; s ...
最新文章
- TypeKit ,use online fonts
- The substring() Method in JDK 6 and JDK 7
- Zabbix的模板管理与配置
- vue Watcher分类 computed watch
- c++ map 修改value_干货 | 名企高频考点如何使用map统计字符串各个字符出现的次数...
- 网络编程懒人入门(六):史上最通俗的集线器、交换机、路由器功能原理入门
- PHP预防XSS攻击,ajax跨域攻击的方法
- 删除表空间联带数据文件
- 视觉slam十四讲ch6曲线拟合 代码注释(笔记版)
- 面试题11. 旋转数组的最小数字
- MySQL函数大全及用法
- form-making爬坑笔记(jeecg项目替换表单设计器)
- C语言 课程设计 实现简单的车辆管理系统
- 笔记本电脑上的以太网消失或者无法识别问题
- java调用kettle自定义kettle.properties配置文件路径
- 【opencv】viz 3D虚拟空间模块编译及使用
- layui实现管理后台页面效果
- Python测试框架之pytest详解
- 黑马程序员_Java_多线程
- matlab 莫比乌斯曲面,『Rhino实例.2』莫比乌斯曲面
热门文章
- 谷歌修复安卓蓝牙组件中无需用户交互的 bug
- 企业软件开发商 Atlassian 紧急修复不慎泄露的0day,IBM Aspera 软件或受影响
- 作业MathExam
- netfilter和iptables的实现机制
- vue.js+koa2项目实战(四)搭建koa2服务端
- 有关 !DOCTYPE HTML
- 魅族2016Java互联网方向其中一道笔试题--青蛙跳台阶问题
- 一道实用linux运维问题的9种shell解答方法!
- EasyNet.Solr 3.5.1发布及使用中的一些原则
- pb调用java webservice_PB调用各类WebService或c#程序