剑指offer-面试题12:打印1到最大的n位数
2016-03-27 20:58
489 查看
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999.
解法:这道提的陷进在于没有规定最大的n位数的范围,会不会溢出,也就是说我们要考虑大数问题。最常用也是最容易的方法是用字符串或者数组去表达大数。
递归解法:
解法:这道提的陷进在于没有规定最大的n位数的范围,会不会溢出,也就是说我们要考虑大数问题。最常用也是最容易的方法是用字符串或者数组去表达大数。
bool increment(char* number) { bool IsOverFlow = false; int TakeOver = 0; int length = strlen(number); for(int index = length - 1; index >= 0; --index) { int num = number[index] - '0' + TakeOver; if(index == length - 1) ++num; if(num >= 10) { if(index == 0) IsOverFlow = true; else { num -= 10; TakeOver = 1; number[index] = '0' + num; } } else { number[index] = '0' + num; break; } } return IsOverFlow; } void PrintNumber(char* number) { bool IsBegin0 = true; int length = strlen(number); for(int i = 0; i < length; ++i) { if(IsBegin0 && number[i] != '0') IsBegin0 = false; if(!IsBegin0) printf("%c", number[i]); } } void Print1ToMaxN(int n) { if(n <= 0) return; char* number = new char[n+1]; memset(number, '0', n); number = '\0'; while(!increment(number)) { PrintNumber(number); cout << " " ; } cout << endl; delete[] number; }
递归解法:
void PrintToMaxOfDigits { if(n <= 0) return; char* number = new char[n + 1]; number = '\0'; for(int i = 0; i < 10; ++i) { number[0] = i + '0'; PrintToMaxOfDigitsRecursively(number, n, 0); } delete[] number; } void PrintToMaxOfDigitsRecursively(char* number, int length, int index) { if(index == length - 1) { PrintNumber(number); return; } for(int i = 0; i < 10; ++i) { number[index + 1] = i + '0'; PrintToMaxOfDigitsRecursively(number, length, index + 1); } }
相关文章推荐
- 要想成为优秀的程序员?多阅读是关键
- Java常见面试题汇总(一)
- 程序员与码农的区别
- 程序员修炼之道
- 码农小汪-Hibernate学习1-Start of Hibernate
- 剑指offer-面试题11:数值的整数次方
- 面试总结
- hihocoder之智力竞赛
- 面试宝典
- 某鹅的面试
- day10 面试 重定向和转发的区别
- 【剑指Offer学习】【面试题56:链表中环的入口结点】
- 阿里JAVA开发面试常问问题总结4
- 阿里JAVA开发面试常问问题总结3
- 面试感悟----一名3年工作经验的程序员应该具备的技能
- 腾讯前端面试
- 面试题的那些事(1)
- 面试总结--阿里杭州
- 前端面试宝典
- 系统设计面试题思路综述