您的位置:首页 > 其它

有关素数的基础算法

2016-04-02 11:37 393 查看
//素性测试  复杂度O(√n) 
//即判断一个正整数是否是素数

#include<iostream>
#include<cstdio>
using namespace std;
bool is_prime(int n) {
for(int i = 2; i * i <= n; i++) {
if(n % i == 0) return false;
}
return n != 1; //1是例外, 既不是素数也不是合数
}

int main() {
cout << "请输入一个正整数" << endl;
int n;
cin >> n;
cout << n << (is_prime(n)?"是":"不是") << "素数" << endl;
return 0;
}

//约数枚举 复杂度O(√n)

//即判断一个数的约数有哪些
#include<iostream>
#include<vector>
using namespace std;
vector<int> divisor(int n) {
vector<int> res;
for(int i = 1; i * i <= n; i++) {
if(n % i == 0) {
res.push_back(i);
if(i != n / i) res.push_back(n / i);
}
}
return res;
}

int main() {
cout << "请输入一个正整数" << endl;
int n;
cin >> n;
vector<int> num(divisor(n));
cout << "将" << n << "进行约数枚举可以得到以下约数:" << endl;
int len = num.size();
for(int i = 0; i < len; i++) {
cout << num[i] << " " ;
}
cout << endl;
return 0;
}
//vector数组的整体赋值问题:
/*
大致有一下几种方法实现用于把一个vector赋值给另一个vector:
方法1:
vector<int > v1(v2);//声明
方法2:使用swap进行赋值:
vector<int > v1();v1.swap(v2);//将v2赋值给v1,此时v2变成了v1
方法3:使用函数assign进行赋值:
vector<int > v1;//声明v1
v1.assign(v2.begin(), v2.end());//将v2赋值给v1
方法4:使用循环语句赋值,效率较差
vector<int >::iterator it;//声明迭代器
for(it = v2.begin();it!=v2.end();++it){//遍历v2,赋值给v1
v1.push_back(it);
}
*/

//整数分解 复杂度O(√n)

//即将一个数分解成多个质因数相乘的形式
#include<iostream>
#include<map>
using namespace std;
map<int , int> prime_factor(int n) { //n是大于1的正整数
map<int, int > res;
for(int i = 2; i * i <= n; i++) {
while(n % i == 0) {
++ res[i];
n /= i;
}
}
if(n != 1) res
= 1;//如果上面循环结束后,n没有变成1就说明n不可以分解, 即是一个质数
return res;
}

int main() {
cout << "请输入一个大于1的正整数" << endl;
int n;
cin >> n;
map<int , int> ans = prime_factor(n); //map赋值问题如下
cout << "将" << n << "进行整数分解得到:" << endl;
cout << n << " = " ;
int t = 0;
for(int i = 2; i <= n; i++) {
while(ans[i]) {
if(t) cout << " x " << i;
else cout << i ;
t++;
ans[i] --;
}
}
return 0;
}
/*
map赋值问题:
1.是会调用红黑树结构的复制构造函数。
2.operator=是有重载的。
所以结构相同时,可以直接 A = B;这样来复制(赋值)
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: