暴力出奇迹
2024-11-17 22:39:41
发布于:广东
49阅读
7回复
1点赞
粗略推算一下,一个数只有第 取余为 或 才有可能是质数.
通过这个办法,我们可以将数据范围从 降至 .
最后配上 的判断就行了
#include <iostream>
#include <cstdio>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
using namespace std;
inline bool check(int n){
if(n % 2 == 0 || n % 3 == 0 || n % 5 == 0) return 0;
for(int i = 6; i * i <= n; i += 6){
if(n % (i + 1) == 0) return 0;
if(n % (i + 5) == 0) return 0;
}
return 1;
}
int main(){
cin.tie(nullptr) -> sync_with_stdio(0);
cout.tie(nullptr) -> sync_with_stdio(0);
int n;
cin >> n;
if(n < 2){
cout << 0;
return 0;
}
int ct = 1;
if(n >= 3) ct++;
if(n >= 5) ct++;
for(int i = 6; i <= n; i += 6){
if(n >= i + 1) ct += check(i + 1);
if(n >= i + 5) ct += check(i + 5);
}
cout << ct;
return 0;
}
全部评论 4
不是暴力用不起,是埃氏筛更有性价比
2024-11-20 来自 云南
0#include <iostream> #include <cmath> using namespace std; int m(int i){ for(int j=2;j<sqrt(i)+2;j++){ if(i!=j and i%j==0){ return 0; } }return 1; } int main(){ int a; cin >> a; int num=0; for(int i=2;i<=a;i++){ num+=m(i); }cout <<num; return 0; }
不挺好?
2025-02-07 来自 浙江
0
看看我的🤔
def s(n): if n <= 2: return 0 s=[True]*(n+1) s[0]=s[1]=False for i in range(2, int(n**0.5)+1): if s[i]: s[i*i:n+1:i]=[False]*len(s[i*i:n+1:i]) return sum(s) n=int(input()) print(s(n))
2024-11-19 来自 湖南
0一眼埃式筛
2024-11-20 来自 广东
0
什么意思,没看懂
2024-11-18 来自 广东
0就是暴力判断质数的优化
2024-11-19 来自 广东
0
???wtf?
2024-11-18 来自 广东
0
有帮助,赞一个