原题链接:算法集训队第二场考核赛_B.质数!!!
B.本世纪最难的编程题
题目描述
给你两个正整数 n n n 和 m m m ,请求出在 [ n , m ] [n,m] [n,m] 间的质数个数以及所有质数的总和。
输入描述
一行内输入两个正整数 n n n 和 m m m 。
输出描述
一行内输出两个整数——分别代表 在 [ n , m ] [n,m] [n,m] 间的质数个数,以及 在 [ n , m ] [n,m] [n,m] 间的所有质数的总和。
输入输出样例
输入 #1:
1 10
输出 #1:
4 17
说明/提示:
【数据范围】
1 ≤ n ≤ m ≤ 1 e 6 1≤n≤m≤1e6 1≤n≤m≤1e6
解决办法:
使用 for(long long int i = 2; i * i <= n; i++) 的质数判断优化方法
时间复杂度为: O ( N ∗ l o g M ) O(N*logM) O(N∗logM)
参考代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool isPrime(ll n)
{
if(n < 2) return false;
for(ll i = 2; i * i <= n; i++)
if(n % i == 0) return false;
return true;
}
int main()
{
int n, m;
ll ans1, ans2;// 质数个数 质数总和
ans1 = ans2 = 0;
cin >> n >> m;
while(n <= m)
{
if(isPrime(n)) ans1++, ans2 += n;
n++;
}
cout << ans1 << ' ' << ans2;
return 0;
}