整数的素数和分解问题
2013-10-16 10:49
447 查看
问题描述
歌德巴赫猜想说任何一个不小于6的偶数都可以分解为两个奇素数之和。
对此问题扩展,如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。
对于一个给定的整数,输出所有这种素数和分解式。
注意,对于同构的分解只输出一次(比如5只有一个分解2 + 3,而3 + 2是2 + 3的同构
分解式)。
例如,对于整数8,可以作为如下三种分解:
(1) 8 = 2 + 2 + 2 + 2
(2) 8 = 2 + 3 + 3
(3) 8 = 3 + 5
解题思路
1、首先要求出所有<=n的素数;
2、然后递归输出所有可能的组合;
代码实现
歌德巴赫猜想说任何一个不小于6的偶数都可以分解为两个奇素数之和。
对此问题扩展,如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。
对于一个给定的整数,输出所有这种素数和分解式。
注意,对于同构的分解只输出一次(比如5只有一个分解2 + 3,而3 + 2是2 + 3的同构
分解式)。
例如,对于整数8,可以作为如下三种分解:
(1) 8 = 2 + 2 + 2 + 2
(2) 8 = 2 + 3 + 3
(3) 8 = 3 + 5
解题思路
1、首先要求出所有<=n的素数;
2、然后递归输出所有可能的组合;
代码实现
#include<iostream> #include <vector> using namespace std; //输出所有<=n的素数 void CalPrime(std::vector<int> &v, int n) { v.clear(); if (n < 2) { return; } v.push_back(2); for (int i = 3; i <= n; i++) { int j = 2; for (j = 2; j*j <= n; j++) { if (i % 2 == 0) { break; } } if (j*j > n) { v.push_back(i); } } } //输出容器中的元素 void _print(const std::vector<int> &v) { for (int i = 0; i < v.size(); i++) { cout<<v.at(i)<<" "; } cout<<endl; } //输出所有的素数组合 void PrintAllDatas(const std::vector<int> &prime, std::vector<int> &v, int n, int start) { if (n < 0) { return ; } else if (n == 0) { _print(v); } else { int sz = prime.size(); for (int i = start; i < sz; i++) { v.push_back(prime[i]); PrintAllDatas(prime, v, n - prime[i], i); v.pop_back(); } } } int main() { int n; while(cin>>n){ std::vector<int> prime; CalPrime(prime, n); std::vector<int> v; PrintAllDatas(prime, v, n, 0); cout<<"----------------------------------"<<endl; } system("pause"); return 0; }
相关文章推荐
- 整数的素数和分解问题
- 158 整数的素数和分解问题
- 整数的素数和分解问题
- 整数的素数和分解问题
- 整数的素数和分解问题
- 整数的素数和分解问题
- 整数的素数和分解问题
- C程序实现整数的素数和分解问题
- 面试题精选(66):整数的素数和分解问题
- 整数的素数和分解问题
- 整数的素数和分解问题
- 素数筛选,整数的唯一分解,整数所有因子之和,递归求等比数列前n项和
- 整数的素数分解算法
- 将一个整数分解为一个或者多个素数的乘积
- 整数因子分解问题
- 正整数最优分解问题
- 南邮 OJ 1219 整数因子分解问题
- 整数的素数和分解
- 有序全排列的题型对比,例如硬币问题和整数分解问题
- 【C/C++】任意大于1的整数分解成素数因子乘积的形式