菜鸟系列之C/C++经典试题(十)
来源:互联网 发布:plc人机界面设计软件 编辑:程序博客网 时间:2024/06/05 03:40
打印1到最大的n位数
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1, 2, 3,…,999.
方法一:
这道题一看感觉很简单,首先求的n位数的最大值,然一个从1到这个最大值的循环就搞定了, 如果真的就把这样的答案面试官的话, 后果很是严重。首先, 没有考虑到获得的这个最大的数会不会溢出,如果溢出了, 答案肯定不对。这个代码比较简单, 我就不列出来了。
方法二:
很明显, 这道题我们可以用递归做, 就是每当多添加一位时, 我就把所以的都打印一遍连带刚添加的这个位, 比如之前是1位的时候, 我当我变成两位数的时候, 就从1-9设置十位数, 每当设置一个值比如1的时候, 就打印除了这个1这个位剩下的所有的可能的数的情况,注意这里的每一个最高位只能1-9,但是别的位的范围是0-9。但是这样的递归很有可能会导致调用栈溢出,我算了一下,最大的8字节的long long类型的整数最大值能达到43位, 这样的话如果用递归去做, 很有可能…..不管怎么样, 这题考的就是个思路, 好了不多说了, 我把我的实现给列出来:
inline void printOneNum(char *pNumbers){ static int count = 0; printf("%-6s,", pNumbers); if (++count == 10) { cout << endl; count = 0; }}inline void printOneNum(long long val){ static int count = 0; printf("%-6ld", val); if (++count == 10) { cout << endl; count = 0; }}void digitRecursive(char *pNumbers, int offset, int bitIndex, const int allBits){ if (bitIndex == allBits) { printOneNum(pNumbers + offset); return; } for (int i = 0; i < 10; ++i) { pNumbers[bitIndex] = i + '0'; digitRecursive(pNumbers, offset, bitIndex + 1, allBits); }}void printEachBitsNumbers(char *pNumbers, int bitIndex, const int allBits){ for (int i = 1; i < 10; ++i) { pNumbers[bitIndex] = i + '0'; digitRecursive(pNumbers, bitIndex, bitIndex + 1, allBits); }}inline int getMaxBitOfLONGLONG(){ return (int)log(LLONG_MAX);}long long getMaxValueOfNBits(const int n){ if (n > getMaxBitOfLONGLONG()) { return -1; } register long long max = 1; for (int i = 0; i < n; ++i) { max *= 10; } return max - 1;}void printAllWithoutRecursive(const int n){ register const long long max = getMaxValueOfNBits(n); for (long long i = 1; i <= max; ++i) { printOneNum(i); }}void printAllNumbers(const int n){ if (n < 0) { fprintf(stderr, "Input param error, the n must large than 0\n"); return; } if (n < getMaxBitOfLONGLONG()) { printAllWithoutRecursive(n); return; } char *pNumbers = new char[n + 1]; pNumbers[n] = '\0'; for (int i = n - 1; i >= 0; --i) { printEachBitsNumbers(pNumbers, i, n); } delete[] pNumbers;}上面的代码的话, 我两中都实现了, 就是当输入的位数比较小的时候, 不溢出, 就用方法一, 如果会溢出, 就用方法二。
当然还有别的实现方法, 这里我就不列出来了。
如果有错误欢迎指出, 分享请辨明
感觉好的话就顶一个, 感觉不错的话就踩一个。
5 5
- 菜鸟系列之C/C++经典试题(十)
- 菜鸟系列之C/C++经典试题(一)
- 菜鸟系列之C/C++经典试题(二)
- 菜鸟系列之C/C++经典试题(三)
- 菜鸟系列之C/C++经典试题(四)
- 菜鸟系列之C/C++经典试题(五)
- 菜鸟系列之C/C++经典试题(六)
- 菜鸟系列之C/C++经典试题(七)
- 菜鸟系列之C/C++经典试题(八)
- 菜鸟系列之C/C++经典试题(九)
- 菜鸟系列之C/C++经典试题(十一)
- 《C菜鸟的蜕化之路系列》-- 推荐经典书籍
- [转载]linux C经典面试题十
- linux C经典面试题十
- linux C经典面试题十
- C++工程师面试宝典系列之C/C++经典面试题
- C++工程师面试宝典系列之C/C++经典面试题
- 经典C面试题
- C语言的流程控制
- xml语言基础
- java中HashMap的用法
- 锥撰宗抓紫佐孜
- Summary
- 菜鸟系列之C/C++经典试题(十)
- 模板的设计和数据处理
- 服务器入门
- Debug中常见错误之对象被提前释放&函数调用中selector传递机制一窥
- simhash算法
- State模式与Strategy模式的区别
- [gevent源码分析] gevent两架马车-libev和greenlet
- 聚会感悟
- Android实现数据存储技术