题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止。

本题陷阱:没有考虑到大数的问题。

本题解题思路:将要打印的数字,看成字符串,不足位的,高位补0。打印字符串的时候要对数字进行判断,不要将高位的0打印出来。打印字符串的结束条件是,当最高位产生进位时结束。

c++代码:

#include<iostream>
using namespace std;
//字符串模拟加法
bool Increment(char* number)
{
//溢出判定
bool isOverFlow = false;
//进位
int nTakeOver = ;
//长度
int nLength = strlen(number); for(int i = nLength - ; i >= ; i--)
{
//第n位的值等于第n位字母的ascii减去 0 的ascii 再加第n+1位的进位
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 PrintNumber(char* number)
{
bool isBegining0 = true;
int nLength = strlen(number); for(int i = ; i< nLength; ++i)
{
if(isBegining0 && number[i] != '')
isBegining0 = false;
if(!isBegining0)
{
printf("%c",number[i]);
}
}
printf("\t");
}
void Print1ToNDigits(int n)
{
if(n<)
return;
char *number = new char[n+];
memset(number, '', n);
number[n] = '\0';
while(!Increment(number))
{
PrintNumber(number);
//printf("%s \n",number);
} delete []number;
}
void main(){
//输出到文件
//freopen("output.txt","w",stdout);
Print1ToNDigits();
}

Java代码:

思路:将n位数看做排列组合问题,有3个位置,每个位上从0到9中选一个数字放进去,求所有的排列情况。

三个位置是依次放进去数字的,这可以用递归。

每个位置上0到9的十种情况可以用for循环来遍历。

另外,记得函数最开始进入时要检查边界条件。

public class Print1ToMaxOfNDigits {

	/**打印从1到最大的N位十进制数
* @param n 位数
*/
public static void print1ToMaxOfNDigits(int n){
//先检查边界条件
if(n<=0)
return;
char[] result=new char[n];
printRecursively(result,0);
} /** 将n位数看做排列组合问题,每个位上从0到9中选一个数字,这样n位数可以在递归中形成。
* @param result 存储n位数,每个元素是一位
* @param index 第index位从0到9中取一个数字。第index位取完数字后,index加1,递归,让下一位选数字。直到i等于result的长度为止,
* 这时n位数就形成了,打印它,回退一步改变最后位置的数字。这样递归下去直到所有数字都打印完毕
*/
private static void printRecursively(char[] result, int index) {
if (index==result.length) {
printNumber(result);
return;
}
for(int i=0;i<10;i++){
result[index]=(char) (i+'0');
printRecursively(result, index+1);
} } /** 高位是0的话不打印,直到遇到不是0的数字为止,截取这一位直到结束的字符串,打印之。
* @param result
*/
private static void printNumber(char[] result) {
// TODO Auto-generated method stub
String s=String.valueOf(result);
for (int i = 0; i < result.length; i++) {
if (result[i]!='0') {
System.out.println(s.substring(i));
return;
}
}
} public static void main(String[] args){
print1ToMaxOfNDigits(2);
} }

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

  1. 剑指offer—第三章高质量代码(数值的整数次方)

    高质量的代码:容错处理能力,规范性,完整性.尽量展示代码的可扩展型和可维护性. 容错处理能力:特别的输入和处理,异常,资源回收. 规范性:清晰的书写,清晰的布局,合理的命名. 完整性:功能测试,边界测 ...

  2. 剑指offer—第三章高质量代码(o(1)时间删除链表节点)

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue ...

  3. 剑指offer—第三章高质量代码(合并两个排序链表)

    题目:输入员两个递增排序的链表,合并这两个链表并使新的链表中的结点仍然是按照递增排序的. 思路:首先,定义两个头节点分别为Head1和Head2的链表,然后比较第一个节点的值,如果是Head1-> ...

  4. 剑指offer第三章

    剑指offer第三章 1.数值的整数次方 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. class Solution { public ...

  5. 剑指offer-第三章高质量的代码(输出该链表中倒数第K个节点)

    题目:输入一个链表,输出这个链表中倒数第K个节点.(代码的鲁棒性) 思路:用两个指针p1和p2,都指向头节点,开始的时候,p2不动,p1移动k-1次,指向第k个节点.此时,如果p1->next! ...

  6. 剑指offer-第三章高质量的代码(调整数组顺序使得奇数位于偶数的前面)

    题目:输入一个整数数组,实现一个函数中调整该数组中数字的顺序,使得所有的奇数位于数组的前半部,所有偶数位于数组的后半部. 思路:用两个指针p1和p2,分别指向数组的头和尾部,p1只向后移,p2只向前移 ...

  7. (剑指Offer)面试题61:按之字形顺序打印二叉树

    题目: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路: 按照广度优先遍历来遍历二叉树,但是需要 ...

  8. 剑指offer第五章

    剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...

  9. 剑指offer第七章&第八章

    剑指offer第七章&第八章 1.把字符串转换成整数 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串 ...

随机推荐

  1. CString,string,char*之间的转换(转)

    这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差.string是使用STL时必不可少的类型,所以是做工程时必须熟练掌握的:char*是从学习C语 ...

  2. ExtJs布局之Column

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...

  3. Windows 7,64位机器上安装DB2 7.2+FP7

    1.要想在Windows 7,64位机器上安装DB2 7.2+FP7,注意:1)拷贝所有安装文件到本地2)设置setup.exe文件兼容windows 20003)使得users用户勾选“完全控制”权 ...

  4. listview优化 汇总

    1,listview加载性能优化ViewHolder 转自: http://blog.csdn.net/jacman/article/details/7087995 在android开发中Listvi ...

  5. 妙味课堂——HTML+CSS(第四课)(二)

    单开一篇来讲一个大点的话题——清浮动    来看下例: <!DOCTYPE html> <html> <head> <meta charset="U ...

  6. http://www.cnblogs.com/leiOOlei/p/5075402.html

    http://www.cnblogs.com/leiOOlei/p/5075402.html

  7. lintcode:Pow(x, n)

    Pow(x, n) Implement pow(x, n). 解题 直接顺序求解,时间复杂度O(N) public class Solution { /** * @param x the base n ...

  8. intent传递参数

    来建第一个Activity:MyIntent  [mw_shl_code=java,true]public class MyIntent extends Activity {              ...

  9. Hadoop基础教程之高级编程

    从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成<key, value>. 2 ...

  10. iOS URL中汉字的编码和解码

    发现NSString类中有内置的方法可以实现.他们分别是: - (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncod ...