原题链接:蓝桥杯算法提高VIP-素数求和
解题思路:
方法大佬们都讲了,线性筛。做实验测了一下效率,用纯数组写法比用vector快50ms左右,但是用纯数组有一点点坑,最后求和的终止条件要把数组大小纳入考虑,用vector的迭代器就没这个顾虑了。看了之前大佬们写的题解,好像有的没注意到这个问题,本地用VS测会翻车
注意事项:
参考代码:
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <vector> #include <string> #include <algorithm> #include <fstream> using namespace std; #define N 5000000 long long primeCheck[N]; vector<long long> primeList; //线性筛素数,合数都可以由两个素数或一个素数一个合数的乘积表示 void getPrime(long long n) { for (long long i = 2; i <= n; i++) { //如果是之前就被标记的数,说明是素数,那么直接放入素数集合 if (primeCheck[i] == 0) primeList.push_back(i); //筛去后面所有由素数和当前数的乘积构成的数,注意这里终止条件应当加上等号,否则n可能不会被筛掉 for (long long j = 0; j < primeList.size() && i*primeList[j] <= n; j++) { primeCheck[i*primeList[j]] = 1; //不重复筛去,减小开销 if (i%primeList[j] == 0) break; } } } long long getPrimeSum(int n) { long long sum = 0; for (vector<long long>::iterator it = primeList.begin(); it < primeList.end(); it++) { if (*it <= n) sum += *it; else break; } return sum; } int main(void) { long long n = 0; cin >> n; getPrime(n); cout << getPrimeSum(n) << endl; return 0; }
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <vector> #include <string> #include <algorithm> #include <fstream> using namespace std; #define N 5000000 long long primeCheck[N]; long long primeList[N]; //线性筛素数,合数都可以由两个素数或一个素数一个合数的乘积表示 int getPrime(long long n) { int pos = 0; for (long long i = 2; i <= n; i++) { //如果是之前就被标记的数,说明是素数,那么直接放入素数集合 if (primeCheck[i] == 0) primeList[pos++] = i; //筛去后面所有由素数和当前数的乘积构成的数,注意这里终止条件应当加上等号,否则n可能不会被筛掉 for (long long j = 0; j < pos && (long long)i*primeList[j] <= n; j++) { primeCheck[i*primeList[j]] = 1; //不重复筛去,减小开销 if (i%primeList[j] == 0) break; } } return pos;//返回素数列表集合的大小 } //这里有一点小坑 long long getPrimeSum(int n, int size) { long long sum = 0; int i = 0; while (primeList[i] <= n && i < size) { sum += primeList[i]; i += 1; } return sum; } int main(void) { long long n = 0; cin >> n; int primeListSize = getPrime(n); cout << getPrimeSum(n, primeListSize) << endl; return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复