今天看了个视频,使用bitset
这个类来求质数,用筛法。所谓筛法就是,给定
N
N
N个数,比如
N
=
10
N=10
N=10,从已知的质数开始,比如
2
2
2,划去所有已知质数的倍数,比如
4
、
6
、
8
、
10
4、6、8、10
4、6、8、10。那现在就只剩
2
、
3
、
5
、
7
、
9
2、3、5、7、9
2、3、5、7、9了,现在下一个数是
3
3
3,那就划去所有
3
3
3的倍数,也就是
9
9
9。现在就剩
2
、
3
、
5
、
7
2、3、5、7
2、3、5、7了。现在下一个数是
5
5
5,没有它的倍数。下一个数是
7
7
7,也没有它的倍数。这样
10
10
10以内的质数就找完了。实现一下:
#include<iostream>
#include<bitset>
using namespace std;
int main()
{
const int maximum = 13;
bitset<maximum + 1> numbers;
//cout << numbers << endl;
numbers.set();
//cout << numbers << endl;
// 考虑从index=1到index=100的位置
numbers.set(1, 0); // index=1置为0
// 有个数学知识是:n一定在开根号n之前至少有1个因数
// 比如:16一定在开根号16之前至少有1个因数,也就是4之前有个因数,显然2和4都是
for (int i = 1; i<=int(sqrt(maximum * 1.0)); i++) {
// 划去现有质数的倍数
if (numbers[i] == 1) {
for (int j = i * i; j <= maximum; j+=i) {
// 将它置0
cout << "i=" << i << ", j=" << j << endl;
numbers.set(j, 0);
}
}
}
// 打印一下质数(不包括第0位的值)
cout << endl;
cout << maximum << "以内共有" << numbers.count()-1 << "个质数, ";
cout << "它们具体是:\n";
int cnt = 0;
for (int i = 1; i <= maximum; i++) {
if (numbers[i] == 1) {
cout << i << "\t";
cnt += 1;
if (cnt % 5 == 0) cout << endl; // 5个一换行
}
}
cout << endl;
return 0;
}