剑指Offer(第二版)面试题17:打印从1到最大的n位数
来源:互联网 发布:零点有数 知乎 编辑:程序博客网 时间:2024/06/03 15:23
剑指Offer(第二版)面试题17:打印从1到最大的n位数
输入数字n,按顺序打印出从1到最大的n位十进制数。
比如输入3,打印1,2,3一直到最大的3位数即999。
思路
如果面试题是关于n位的整数并且没有限定n的取值范围,或者输入任意大小的整数,那么这道题目很有可能是需要考虑大数问题的。字符串是一种简单、有效表示大数的方法。
代码
- 在字符串上模拟数字加法的解法,绕过陷阱。如何快速判断在增加了1过后,是否到达了最大的n位数是本题的一个小陷阱。
bool Increment(char* number){ bool isOverflow = false; int nTakeOver = 0; int nLength = strlen(number); for (int i = nLength - 1; i>=0; i--) { 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;}
- 把问题转换位数字排列的解法,递归让代码更简洁
#include <iostream>using namespace std;void Print1ToMaxOfNDigits(int n);void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index);void PrintNumber(char* number);int main(){ int n; cin >> n; while(n != -666) { Print1ToMaxOfNDigits(n); cin >> n; } return 0;}void Print1ToMaxOfNDigits(int n){ if(n <= 0) return; char* number = new char[n + 1]; memset(number,'0',n); number[n] = '\0'; for(int i = 0; i < 10; ++i) { number[0] = '0' + i; Print1ToMaxOfNDigitsRecursively(number,n,0); } return;}void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index){ if(index == length - 1) { PrintNumber(number); return; } for(int i = 0; i < 10; ++i) { number[index + 1] = '0' + i; Print1ToMaxOfNDigitsRecursively(number,length,index + 1); } return;}void PrintNumber(char* number){ bool isBeginning0 = true; int len = strlen(number); for(int i = 0; i < len; ++i) { if(isBeginning0 && number[i] != '0') isBeginning0 = false; if(!isBeginning0) { cout<<number[i]; } } if(!isBeginning0) cout<<'\t'; return;}
阅读全文