spj PRIME1 Prime Generator:错误答案
SPOJ PRIME1 Prime Generator: Wrong Answer?
在SPOJ上执行这个问题,尝试实现一个筛和一个分段筛来获得所需的素数。我的代码如下:
//Prime Generator
#include <iostream>
#include <math.h>
#include <cstdio>
using namespace std;
int main() {
//traditional sieve
int squareRoot = sqrt(1000000000);
//printf("%dnn", squareRoot);
bool primeList[squareRoot] = {false}; //all primes are marked as true, composite is false
//make entire array true
for (int i = 1; i < squareRoot; i++){
primeList[i] = true;
}
//traditional sieve to find primes first
for (int i = 2; i <= squareRoot; i++){
for (int j = i*i; j <= squareRoot; j+=i){
//composites are marked as false
primeList[j - 1] = false;
}
}
//segmented sieve + output
int a;
scanf("%d", &a);
while (a > 0){
int m, n;
scanf("%d%d", &m, &n);
//if lower than this range, then we can just output the primes we already computed
if (n <= squareRoot){
for (int i = m; i <= n; i++){
if (primeList[i - 1] == true){
printf("%dn", i);
}
}
printf("n");
}
//it is beyond this range, so we need to segment sieve
else {
int upperLimit = sqrt(n); //highest we need to divide by
int diff = n - m;
bool myPrimes[diff + 1];
for (int i = 0; i <= diff; i++){
myPrimes[i] = true;
}
for (int i = 2; i <= upperLimit; i++){
if (primeList[i - 1] == true){
int lowest = m/i * i;
while (lowest < m){
lowest += i;
}
while (lowest <= n){
myPrimes[lowest - m] = false;
lowest += i;
}
}
}
for (int i = m; i <= n; i++){
if (myPrimes[i - m] == true){
printf("%dn", i);
}
}
printf("n");
}
a--;
}
}
我要做的基本逻辑是:
首先对埃拉托色尼进行筛选,生成根号下10^9的所有质数,因为10^9是n的上限。
如果n小于根号(10^9),那么我不计算任何新的东西,只是从(1)中输出适当的素数。
如果n大于sqrt(10^9),那么我首先计算sqrt(n),这是我们需要的最大数字,因为任何更大的数字在[m, n]范围内都不能被整除。
然后我将做实际的筛选,从2开始,并尝试将所有是素数的倍数的数字标记为假。我做'lowest = m/I * I '来得到最接近m的数字,其中lowest <= m。如果它低于m,那么我加到刚好高于m。例如,如果m==125, n == 200,那么125/2 = 62,62 *2 = 124。124+2 == 126,这将是[125,200]中第一个是2的倍数的数。
则输出所有未被标记为false的数字
我的问题是,似乎我的算法是正确的(对我来说)。我非常确定我的第一个筛是有效的,但似乎它在生成大于根号(10^9)的质数时可能会出现问题。然而,从我的测试来看,它似乎确实生成了所有的质数(而且只有质数)。我生成质数的算法是不是太不确定了?这是舍入的一次性问题吗?
我猜错误来自
for (int i = 2; i <= upperLimit; i++){
if (primeList[i - 1] == true){
int lowest = m/i * i;
while (lowest < m){
lowest += i;
}
while (lowest <= n){
myPrimes[lowest - m] = false;
lowest += i;
}
}
}
但是我不知道在哪里。欢迎任何提示或指导!
我得到了错误,它在第二种情况下,你正在定义myprime [diff] = {true}。但是想想输入的时间是怎样的M = 1且n> sqrt(1000000000)则1为质数
希望能接受你的回答。
相关文章:
- 递归求和任务的错误答案
- 为什么我在代码厨师的 CMPRSS 问题中得到 WA(错误答案)?
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 寻找最小楼梯成本的动态规划问题的错误答案
- 为什么可变大小的数组会导致Codechef出现错误答案
- 如何修复此代码对几个测试用例的错误答案?
- 使用幂函数的计算给出了大数字的错误答案
- 快速排序算法,一些特定输入序列的错误答案和分段错误
- 二分法程序的错误答案(C++)
- 无法理解绘图程序中的错误答案
- C++ - 整数除以整数返回错误答案
- 布尔函数的错误答案
- SPOJ FASTFLOW上的错误答案
- 代码的错误答案是在Java Camel案件和C 下划线标识符之间转换的错误答案
- 200万以下所有素数的总和,线程给出错误答案
- 0-1整数背包返回错误答案(动态编程)
- UVa 在线判断 - 3n + 1 - 错误答案
- 提升C++原始算法错误答案
- 二项式系数函数C++错误答案 n>13
- 需要帮助以避免 SPOJ 上的"错误答案"