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

 void PrintfToMaxNDigits(int n)
{
int number=;
int i=;
while(i++<n)
number *=;
for(i=;i<number;i++)
printf("%d\t",i);
}
这样初看起来没有什么问题,但是如果仔细分析这个问题就会发现"当n输入很大时",数据就会发生溢出。
所以可以尝试通过字符串来模拟数字加法的解法,绕过陷阱才能拿到Offer
因此我们只需要做两件事情:
1,在字符串表达的数字上模拟加法;
2,把字符串表达式的数字打印出来;
基于上面的分析,我们可以写出如下代码:
 void Print1ToMaxNdigits(int n)
{
if(n<=)
return;
char *number=new char[n+];
memset(number,'',n);
number[n]='\0';
while(!Increment(number))
{
PrintfNumber(number);
}
delete []number;
} bool Increment(char* number)
{
bool isOverflow=false;
int nTakeOver=;
int nLength=strlen(number);
for(int i=nLength-;i>=;i--)
{
int nSum=number[i]-''+nTakeOver;
if(i==nLength-)
nSum++;
if(nSum>=)
{
if(i==)
isOverflow=true;
else
{
nSum -=;
nTakeOver=;
number[i]=''+nSum;
}
}
else
{
number[i]=''+nSum;
break;
}
}
return isOverflow;
} void PrintfNumber(char *number)
{
bool isBeginning0=true;
int nlength=strlen(number);
for(int i=;i<nlength;++i)
{
if(isBeginning0&&number[i]!='')
isBeginning0=false;
if(!isBeginning0)
{
printf("%c",number[i]);
}
}
printf("\t");
}
把问题转换成数字排列的解法,递归让代码更简洁:
接下来我们换一种思路来考虑这个问题,如果我们在数字前面补0的话,就会把数字的每一位都从0~9排列一遍,就得到了所有的十进制数.只是我们在打印的时候,数字排在前面的0我们不打印出来罢了。全排列用递归很容易表达,数字的每一位都可能是0~9中的一个数,然后设置下一位,递归结束的条件是我们已经设置了数字的最后一位.
 void Print1ToMaxOfNDigitsRecursively(char* number,int length,int index)
{
if(index==length-)
{
PrintNumber(number);
return;
}
for(int i=;i<;++i)
{
number[index+]=i+'';
Print1ToMaxOfNDigitsRecursively(number,length,index+);
}
} void Print1ToMaxOfNDigits(int n)
{
if(n<=)
return;
char* number=new char(n+);
number[n]='\0';
for(int i=;i<;++i)
{
number[]=i+'';
Print1ToMaxOfNDigitsRecursively(number,n,);
}
delete [] number;
}

输入数字n,按顺序打印出从1到最大的n位十进制数的更多相关文章

  1. 打印出从1到最大的n位十进制数

    首先这一题会溢出,要考虑的大数问题.所以不能用简单的是int类型数来表示(32位无符号int 范围是0x00000000···0xFFFFFFFF),下面主要是非递归的实现代码,自己做了注释方便以后回 ...

  2. 剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)

    题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止. 本题陷阱:没有考虑到大数的问题. 本题解题思路:将要打印的数字,看成字符串,不足位 ...

  3. JS+PHP实现用户输入数字后取得最大的值并显示为第几个

    目的:分清JS PHP的区别,拓宽思维 分析 1.利用JS的prompt输入用户想要输入的值. 2.利用HTML表单的text标签将输入的值传递给PHP处理文件 3.PHP进行数值判定,选出最大值和位 ...

  4. 04实现累加和计算功能并且实现textbox不允许输入数字以外的字符但不包括退格键同时不允许第一个数值为0

    private void button1_Click(object sender, EventArgs e) { double number1, number2; if (double.TryPars ...

  5. JS验证只能输入数字,数字和字母等的正则表达式

    JS判断只能是数字和小数点 0.不能输入中文1)<input onpaste="return false;" type="text" name=" ...

  6. 限制HTML的input只能输入数字、英文、汉字...

    限制HTML的input只能输入数字.英文.汉字... 关键词:正则表达式, JavaScript, HTML, input 常用HTML正则表达式1.只能输入数字和英文的:<input onk ...

  7. Delphi控件之---UpDown以及其与TEdit的配合使用(比如限制TEdit只能输入数字,还有Object Inspector之组件属性的介绍)

    最近在开发中使用到了UpDown这个控件,但是因为之前没有使用过,所以很不熟悉,于是就编写了一个简单的demo来学习UpDown以及其结合TEdit的用法. 初步的常用功能的简介 目前(2015.08 ...

  8. js判断只能输入数字和只能输入

    JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'' ...

  9. js只能输入数字、汉字、字母等正则匹配

    只能输英文:<input type="text" onkeyup="value=value.replace(/[^a-zA-Z]/g,'')"> 只 ...

随机推荐

  1. Flink on yarn的问题:Invalid AMRMToken

    目前采用的Flink的版本是1.4.2,运行在yarn上,总是时不时的报错“Invalid AMRMToken from appattempt”,导致AM挂掉. 简而言之,就是AM和RM沟通的过程中, ...

  2. javaScript运算符学习笔记

    1.赋值运算符 javaScript运算符可以分为简单赋值和复合赋值运算.简单赋值运算是将赋值运算符(=)右边的表达式的值保存到赋值运算符左边的变量中,复合赋值运算则是混合了其他操作(算术运算操作,位 ...

  3. [剑指Offer] 38.二叉树的深度

    题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. [思路1]递归 /* struct TreeNode { int v ...

  4. 框架开发中的junit单元测试

    首先写一个测试用的公共类,如果要搭建测试环境,只要继承这个公共类就能很容易的实现单元测试,代码如下 import org.junit.runner.RunWith; import org.spring ...

  5. 周记【距gdoi:117天】

    国庆被“吞”了 图论还剩下平面图.分层图.欧拉图…… 是现实太残酷还是自己兴趣不够? 努力吧.

  6. [poj 2274]后缀数组+最长公共子串

    题目链接:http://poj.org/problem?id=2774 后缀数组真的太强大了,原本dp是O(nm)的复杂度,在这里只需要O(n+m). 做法:将两个串中间夹一个未出现过的字符接起来,然 ...

  7. Linux设置虚拟内存-创建和启用Swap交换区

    如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不增加物理内存的情况下,启用swap交换区作为虚拟内存是一个不错的选择,如果是SSD硬盘,正常读写速度都在300M ...

  8. 纯手工 CheckboxTree 实现

    数据结构及页面显示格式: INSERT INTO AS_CombRules VALUES('', '', '', '', '', '', '') 实现 CheckboxTree 功能: html代码: ...

  9. domReady的兼容性实现方法

    一.为何要实现domReay方法? 举例: <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  10. ES6学习笔记(二)——数组的扩展

    扩展运算符 ... 将数组转化成用逗号分隔的参数序列 * 扩展运算符背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换. 应用 1. 合并数组 2. 将 ...