(剑指Offer)面试题12:打印1到最大的n位数
题目:
输入数字n,按顺序打印出从1到最大的n位十进制数。
比如输入3,打印1,2,3一直到最大的3位数即999。
思路:
1、不考虑n的范围,直接打印。
void Print1ToMaxOfNDigits_1(int n){
int number=1;
for(int i=0;i<n)
number=10*number;
for(int i=1;i<number;i++)
cout<<i<<"\t";
cout<<endl;
}
2、如果n很大,能表示范围超出了int 或者long long的范围,那么就需要考虑大数问题。
最常用也是最容易的方法就是用字符串或者数组来表示大数。
数字最大为n位,因此我们需要一个n+1长度的字符串来存储,最后一位为结束符号'\0',实际位数不够n位时,在字符串前部分补‘0’.(打印的时候将前面的'0'去掉)
步骤:
1、字符串每一位都初始化为‘0’;
2、每一次为字符串表示的数字+1,如果没有超出范围,则打印出来;
如何判断有没有溢出?+
当字符串表示的第一位数即最高位,(最高位+进位)大于或等于10,即判断溢出。
如何打印字符串?
打印字符串时,需要将前部分的'0'省略掉。
递归实现:
n位所有十进制数其实就是n个从0到9的全排列。即把数字的每一位都从0到9排列一遍,就得到了所有的十进制数。
全排列用递归很容易实现,数字的每一位都可能是0-9的一个,然后设置下一位。递归的结束条件是我们已经设置了数字的最后一位。
代码:
#include <iostream>
#include <string.h> using namespace std; bool Increment(char* number){
bool isOverflow=false;
int nTakeOver=0;
int nLength=strlen(number);
int nSum; for(int i=nLength-1;i>=0;i--){
nSum=number[i]-'0'+nTakeOver;
if(i==nLength-1)
nSum++;
if(nSum>=10){
if(i==0)
isOverflow=true;
else{
nSum=nSum-10;
nTakeOver=1;
number[i]='0'+nSum;
}
}
else{
number[i]='0'+nSum;
break;
}
}
return isOverflow;
} void PrintNumber(char* number){
int i=0;
int length=strlen(number);
while(number[i]=='0')
i++;
for(int j=i;j<length;j++)
cout<<number[j];
cout<<"\t";
} void Print1ToMaxOfNDigits(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;
} void Print1ToMaxOfNDigits_1(int n){
int number=1;
for(int i=0;i<n)
number=10*number;
for(int i=1;i<number;i++)
cout<<i<<"\t";
cout<<endl;
} int main()
{
Print1ToMaxOfNDigits(3);
return 0;
}
#include <iostream>
#include <string.h> using namespace std; void PrintNumber(char* number){
int i=0;
int length=strlen(number);
while(number[i]=='0')
i++;
for(int j=i;j<length;j++)
cout<<number[j];
cout<<"\t";
} void Print1ToMaxOfNDigits_recursively(char* number,int length,int index){
if(index==length){
PrintNumber(number);
return;
}
for(int i=0;i<10;i++){
number[index]='0'+i;
Print1ToMaxOfNDigits_recursively(number,length,index+1);
}
} void Print1ToMaxOfNDigits_2(int n){
if(n<=0)
return;
char* number=new char[n+1];
number[n]='\0';
Print1ToMaxOfNDigits_recursively(number,n,0);
delete number;
} int main()
{
Print1ToMaxOfNDigits_2(3);
return 0;
}
(剑指Offer)面试题12:打印1到最大的n位数的更多相关文章
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
问题描述: 输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可. public ...
- 剑指Offer - 九度1515 - 打印1到最大的N位数
剑指Offer - 九度1515 - 打印1到最大的N位数2013-11-30 01:11 题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案 ...
- 【剑指offer 面试题12】打印1到最大的n位数
思路: 用n位字符数组表示n位数,通过递归的方式逐层(位)遍历,递归终止时打印. #include "stdio.h" #include "string.h" ...
- 剑指offer面试题12-打印1到最大的n位数
题目: 输入一个数字n,按顺序打印出从1最大的n位十进制数.比方输入3,则打印出1.2.3最大的三位数即999 这道题的主要陷阱就在大数的处理,仅仅要将这个考虑进去,用字符串来表示.就好说了. 那差点 ...
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
题目链接地址: http://ac.jobdu.com/problem.php? pid=1368 题目1368:二叉树中和为某一值的路径 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252 ...
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
- C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解
剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
随机推荐
- lambda 表达式+python内置函数
#函数 def f1(a,b): retrun a+b #lambda方式,形参(a,b):返回值(a+b) f2=lambda a,b : a+b 在一些比较简单的过程计算就可以用lambda p ...
- 【51Nod 1756】【算法马拉松 23】谷歌的恐龙
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1765 设答案为\(X\). 则\[X=\frac{m}{n}\times ...
- codevs 1044 拦截导弹 1999年NOIP全国联赛提高组
1044 拦截导弹 1999年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 某国为 ...
- 51nod1437 迈克步 单调栈
考虑一个点作为最小值的区间$[L[i], R[i]]$ 那么这个区间的所有含$i$的子区间最小值都是$v[i]$ 因此,用单调栈求出$L[i], R[i]$后,对$R[i] - L[i] + 1$这个 ...
- Every-SG 博弈论 mark定义和结论
http://blog.sina.com.cn/s/blog_51cea4040100h3l9.html 这种类型,可以想成这样,有N组游戏,有N个穿红色衣服的人代表先手,有N个穿蓝色衣服的人代表后手 ...
- HDU 6071 Lazy Running(最短路)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6071 [题目大意] 给出四个点1,2,3,4,1和2,2和3,3和4,4和1 之间有路相连, 现在 ...
- bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...
- wampserver -- 取消PHP页面Warning和Notice级别的报错
Learn from:http://yige.org/p/91 一般遇到这样的问题,有两个方法:1.如果有服务器权限,直接把服务器上的php.ini的配置改了,改成不输出Warning和Notice级 ...
- Linux下简单分析请求有没有进到本机的工具tcpdump(网络接口的数据包的头信息)
可以通过这个工具快速分析出一个请求到底有没有进入到本机.信息有点简单,对于前期的分析比较有帮助.而对于详细的分析可以借助iptables的raw表进行日志分析. 参考: http://man.linu ...
- Are you sure your NDK_MODULE_PATH variable is properly defined?(2)
Are you sure your NDK_MODULE_PATH variable is properly defined? STEP1: MIND: 明确NDK_MODULE_PATH概念ht ...