剑指offer-12:打印1到最大的n位数
2017-08-14 21:03
344 查看
输入数字n,按顺序打印从1到最大的n位十进制数。
例如:n=3,则打印1,2,3都999。
分析:
此题并未给出n的范围,若取n=10,则int表示溢出。所以考虑大数问题。
用字符串或者数组可以表示大数。
本质是全排列问题,即n位每个位从0-9排列,可用递归实现。
打印数字时,需要考虑从第一个非0的元素开始打印。
1.有没有更高效的表示大数?
一个char型字符表示可表示256个字符,而十进制数字只有0-9的10个数字,并没有充分利用。
2.大数的加减法,乘法。
例如:n=3,则打印1,2,3都999。
分析:
此题并未给出n的范围,若取n=10,则int表示溢出。所以考虑大数问题。
用字符串或者数组可以表示大数。
本质是全排列问题,即n位每个位从0-9排列,可用递归实现。
打印数字时,需要考虑从第一个非0的元素开始打印。
// offer-12-print_n.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <string> using namespace std; // 打印数组,从第一个非0的开始打 void PrintNumber(char * number, int length) { bool First0 = true; for(int i = 0; i < length; ++i) { if(number[i] != '0' && First0) First0 = false; if(!First0) cout << number[i]; } // 全0时不打印换行 if(First0); else cout << endl; } // 递归打印全排列数 void Print1toN_Recursive(char * number, int length, int index) { if(index == length - 1) { PrintNumber(number, length); return; } for(int i = 0; i < 10; ++i) { number[index + 1] = i + '0'; Print1toN_Recursive(number, length, index+1); } } // 第0位共10个排列,依次起头进递归 void Print1toN(int n) { if(n <= 0) return; char * number = new char[n+1]; number = '\0'; for(int i = 0; i < 10; i++) { number[0] = i + '0'; Print1toN_Recursive(number, n, 0); } delete [] number; } // 测试 int _tmain(int argc, _TCHAR* argv[]) { int n; while(1) { cin >> n; Print1toN(n); } return 0; }
1.有没有更高效的表示大数?
一个char型字符表示可表示256个字符,而十进制数字只有0-9的10个数字,并没有充分利用。
2.大数的加减法,乘法。
相关文章推荐
- 【剑指offer 面试题12】打印1到最大的n位数
- 剑指Offer----面试题12:打印1到最大的n位数
- 剑指offer--面试题12:打印1到最大的n位数--Java实现
- 剑指Offer之面试题12:打印1到最大的N位数
- 【剑指Offer学习】【面试题12 :打印1 到最大的n 位数】
- 【剑指offer】题12:打印1到最大的n位数
- 剑指offer 12. 打印1到最大的n位数
- 剑指offer面试题12 打印1到最大的n位数
- 剑指offer面试题12——打印1到最大的n位数
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
- 剑指offer 面试题12—打印1到最大的n位数
- 剑指Offer系 4000 列-面试题12:打印1到最大的n位数
- 剑指offer-面试题12.打印1到最大的n位数
- 剑指offer_12(打印出从1到最大n位数)
- 剑指offer-面试题12-打印1到最大的n位数
- 剑指offer之面试题12:打印1到最大的n位数
- 剑指offer面试题12——打印1到最大的n位数
- 剑指offer_12_打印1到最大的n位数
- 剑指offer-面试题12:打印1到最大的n位数
- 剑指Offer:面试题12 打印1到最大的n位数