剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)
题目:输入一个数字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 = 0; //长度 int nLength = strlen(number); for(int i = nLength - 1; i >= 0; i--) { //第n位的值等于第n位字母的ascii减去 0 的ascii 再加第n+1位的进位 int nSum = number[i] - '0' + nTakeOver; if(i == nLength - 1) ++nSum; if(nSum >= 10) { if(i == 0) isOverFlow = true; else { nSum -= 10; nTakeOver = 1; number[i] = '0' + nSum; } } else { number[i] = '0' + nSum; break; } } return isOverFlow; } //打印字符串表示的数字 void PrintNumber(char* number) { bool isBegining0 = true; int nLength = strlen(number); for(int i = 0; i< nLength; ++i) { if(isBegining0 && number[i] != '0') isBegining0 = false; if(!isBegining0) { printf("%c",number[i]); } } printf("\t"); } void Print1ToNDigits(int n) { if(n<0) return; char *number = new char[n+1]; memset(number, '0', n); number[n] = '\0'; while(!Increment(number)) { PrintNumber(number); //printf("%s \n",number); } delete []number; } void main(){ //输出到文件 //freopen("output.txt","w",stdout); Print1ToNDigits(3); }
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); } }