求一个整数的和子式
2013-12-05 19:36
281 查看
题目:
这是一道在QQ群里调侃时所见到的题题目的内容大概是这个样子
将一个整数分解成其他整数加和的形式,比如输入4,产生如下输出
1+1+1+1 2+1+1 1+2+1 3+1 1+1+2 2+2 1+3 4
解法一(递归的方法)
这个解法是一个递归的方法,思路就是将输入的数n拆分成a+b的形式然后求所有的b的可能的解,然后再与a相加代码如下:
#include <iostream> #include <vector> using namespace std; vector<vector<int>> find_Add(int n) { vector<vector<int>> outside; for(int i = 1; i != n; i++) { vector<vector<int>> temp; temp = find_Add(n - i); for(auto iter_out = temp.begin(); iter_out != temp.end(); iter_out++) { iter_out->push_back(i); outside.push_back(*iter_out); } } vector<int> inside; inside.push_back(n); outside.push_back(inside); return outside; } int main() { vector<vector<int>> hello; int n = 1; while(cin >> n) { hello = find_Add(n); cout << hello.size() << endl; for(auto iter = hello.begin(); iter != hello.end(); iter++) { auto iter2 = iter->begin(); for(; iter2 != iter->end() - 1; iter2++) { cout << *iter2 << '+'; } cout << *(iter2++) << endl; } hello.clear(); } return 0; }
递归的方法虽然简单,但是因为重复运算了很多遍子结果,所以效率很低
解法二(保存小结果)
为了不重复计算子结果,将其保存下来,以供后面计算使用。这样,比解法一多消耗一倍的空间,但是能够节省大量的时间vector<vector<int>> find_Add(int n) { vector<vector<vector<int>>> table; for(int i = 0; i != n; i++) { vector<int> temp_in{i + 1}; vector<vector<int>> temp_mid{temp_in}; temp_mid.reserve(pow(2,i)); table.push_back(temp_mid); } for(int i = 0; i != n; i++) { auto iter_now = table.begin() + i; for(int j = i; j != 0; j--) { vector<vector<int>> &temp_mid = table.at(i - j); for(auto iter_mid = temp_mid.begin(); iter_mid != temp_mid.end(); iter_mid++) { (*iter_mid).push_back(j); (*iter_now).push_back(*iter_mid); (*iter_mid).pop_back(); } } } return table.at(n - 1); }
运行时间对比
在我电脑上的运行时间如下,单位是秒:n | 15 | 20 |
解法一 | 0.95 | 3.868 |
解法二 | 0.2 | 0.65 |
相关文章推荐
- 判断一个整数数组中是否有重复数字出现的O(n)时间复杂度算法
- 《剑指offer》-将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数
- 整数划分问题:输出一个整数的所有划分并统计总划分数
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 汇编-分离一个整数的各个位
- 腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
- 编写一个类的方法,其输入参数为一个整数,输出为该整数各个位上的最大数字
- 一个js的整数随机数函数
- 基础算法测试——生成一个1-10之间的随机整数组合
- 【C语言】编写代码实现:求一个整数在内存中的二进制位中1的个数
- 设计reverse函数,将一个整数转化为其逆序数。
- 返回一个二维整数数组中的最大子数组之和(环)
- 输入一个整数,打出整数行星号
- 编写一个函数将一个十六进制数的字符串参数转换成整数返回
- ACM457现在给出了一个只包含大小写字母的字符串,不含空格和换行,要求把其中的大写换成小写,小写换成大写,然后输出互换后的字符串。输入 第一行只有一个整数m(m<=10),表示测试数据组数。
- 面试题:元素为32位整数的数组中只有一个数字出现2次,其余都是出现3次,求这个数
- [南阳OJ-No.24]素数距离问题|现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。 如果输入的整数本身就是素
- 给定一整数 n 产生一个 1 到 n*n的螺旋形数组
- 写一个函数,检查字符是否是整数,如果是,返回其整数值
- 转:整除运算, 写一个程序,接收两个整数a和b,关判断a是否能被b整除,输出判断结果