题目:输入数字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. HighCharts中几种tooltip的显示格式

    推荐学习地址 => https://www.hcharts.cn/docs/basic-tooltip   https://api.hcharts.cn/#Highcharts.numberFo ...

  2. HDU3488:Tour(KM算法)

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  3. HDU 多校对抗赛第二场 1010 Swaps and Inversions

    Swaps and Inversions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  4. javascript中的递增递减操作符

    javascript中递增递减属于一元操作符,所谓一元操作符,即只能操作一个值的操作符. 递增和递减操作符各有两个版本:前置型和后置型.顾名思义,前置型应该位于要操作的变量之前,而后置型应该位于要操作 ...

  5. 不谈OI:高二(13)最后一次班班有歌声

    最后一次班班有歌声了…… 自己因为搞oi并没有参加,只是决赛的时候幕后放了放背景视频…… 不管怎么说,我们班唱的很棒啊,全部人都很棒! 说真的我为我们班骄傲 视频: https://v.qq.com/ ...

  6. [vue-router] Failed to resolve async component default: Error: Loading chunk 0 failed.

    在整合laravel5.4 和vue2.1的时候遇到一个奇怪的问题 Uncaught SyntaxError: Unexpected token < Error: Loading chunk 0 ...

  7. algorithm ch2 Merge_sort

    这是用分治法来对序列进行排序,将较长的一个序列分解为n个比较短的序列,然后分别处理这n个较小的段序列,最后合并.使用递归的来实现. 具体实现的代码如下: void MergeSort(int *A, ...

  8. linux驱动基础系列--linux spi驱动框架分析

    前言 主要是想对Linux 下spi驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型等也不进行详细说明原理.如果有任何错误地方,请指出,谢谢! spi ...

  9. locust===注意事项

    1.安装包在:微盘 2.运行命令是:locust -f load_test.py --host=https://www.baidu.com 3.本地打开的是:http://localhost:8089 ...

  10. try_module_get和module_put【转】

    转自:http://blog.csdn.net/adaptiver/article/details/7000617 转自:http://apps.hi.baidu.com/share/detail/4 ...