欧拉项目 #10 如何预先计算素数的总和
Project Euler #10 How to pre-calculate sum of primes?
这是个问题:
低于 10 的素数之和是 2+3+5+7=17。
求所有素数的总和不大于给定的 N。
输入格式 :第一行包含一个整数 T,即测试用例的数量。接下来的 T 行将包含一个整数 N。
输出格式 :在单独的行中打印与每个测试用例对应的值。
约束:1≤T≤1041≤N≤106
https://www.hackerrank.com/contests/projecteuler/challenges/euler010这是问题的链接。
所以,我试图用埃拉托色尼的筛子来解决这个问题。我预先计算了所有低于 10^6 的素数,这是 N 的给定极限。
7 个测试用例中有 6 个被接受,但最后一个测试用例给出超时 (TLE)。
我读了讨论论坛,他们说为了解决这个问题,我们也需要预先计算素数的总和。
因此,我尝试制作一个长整数数组,并尝试将所有金额存储在其中。但这给了我一个细分错误。
那么,我应该如何预先计算素数的总和呢?
这是我的代码:
#include "header.h" //MAX is defined to be 1000000
bool sieve[MAX + 1]; // false = prime, true = composite
int main(void){
//0 and 1 are not primes
sieve[0] = sieve[1] = true;
//input limiting value
int n = MAX;
//cross out even numbers
for(int i = 4; i <= n; i += 2){
sieve[i] = true;
}
//use sieve of eratosthenes
for(int i = 3; i <= static_cast<int>(sqrt(n)); i += 2){
if(sieve[i] == false){
for(int j = i * i; j <= n; j += i)
sieve[j] = true;
}
}
long long p, ans = 0;
int t;
std::cin >> t;
while(t--){
std::cin >> p;
for(int i = 0; i <= p; ++i)
if(sieve[i] == false)
ans += i;
std::cout << ans << std::endl;
ans = 0;
}
return 0;
}
给定一个素数数组prime[N]
,预计算素数和可以在单个for
循环中完成,如下所示:
int sum[N];
sum[0] = primes[0];
for (int i = 1 ; i < N ; i++) {
sum[i] = prime[i]+sum[i-1];
}
您可以通过对primes
运行二叉搜索来将此数组与primes[]
一起使用,如果搜索的数字是素数,则在同一位置选择sum
,如果数字不是素数,则在前一个位置选择该数组。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 在循环条件 i<sqrtN(预先计算)和 i*i<N 中,C++哪个更有效?
- 允许预先计算和计算的结果
- 如何用预先计算的十六进制值初始化双数组
- 将 UTF-8 转换为 UTF-32,预先计算每个'chars'数
- 在 gcc-4.8 (C++11) 中预先计算
- 减少 GPU 和 CPU 之间的带宽(先发送原始数据或预先计算)
- 您可以使用模板预先计算 2 的幂表吗?
- 在表中预先计算一次cos()和sin()
- 我如何在OpenCL中插入一组预先计算的函数
- 预先计算数据vs顺序处理
- 使用预先计算的数组或函数
- 欧拉项目 #10 如何预先计算素数的总和
- 有没有更好的方法可以通过模板用预先计算的值填充数组(用于运行时)
- VS2010是否预先计算由#define定义的预处理器?