剑指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(" "); } void Print1ToNDigits(int n) { if(n<0) return; char *number = new char[n+1]; memset(number, '0', n); number[n] = '