eratosthenes筛不工作c++
Sieve of eratosthenes not working C++
所以我试图制作一个c++程序来生成所有素数,直到某一点,但由于某种原因,它将2之后的所有数字打印为非素数。
int A[1000000];
void sieve(int till)
{
for(int i = 2; i < till; i++)
{
if(A[i] == 0)
{
for(int j = i*i; j < till; j+=i)
{
A[j - 1] = 1;
//printf("%i is NOT primen", ij);
}
}
}
}
和在主I do:
int N;
scanf("%i", &N);
sieve(N);
但是当我试着调试的时候它说:
NOT PRIME 0
NOT PRIME 1
NOT PRIME 2
PRIME 3
NOT PRIME 4
PRIME 5
NOT PRIME 6
PRIME 7
NOT PRIME 8
PRIME 9
NOT PRIME 10
PRIME 11
NOT PRIME 12
NOT PRIME 13
有谁知道我做错了什么吗?
非常简单。我们有几个简单的例子:
- 大于两个因数,所以不是素数
- 1只有一个因数,所以它不是素数
- 2是唯一为素数的偶数
所以,基本上我们不应该计算偶数。我们只对奇数感兴趣。
我们将所有非素数标记为1。
int A[1000000];
void sieve(int till)
{
// mark all even numbers (except 2) as not prime
for(int i = 4; i < till; i += 2)
{
A[i] = 1;
}
// now calculate not primes for only odd numbers
for(int i = 3; i < till; i += 2 )
{
if(A[i] == 0)
{
for(int j = i*i; j < till; j+=(i+i))
{
A[j] = 1;
}
}
}
}
int main()
{
int N;
scanf("%i", &N);
sieve(N);
for(int i = 2; i < N; i++)
{
if(A[i] == 1) printf("%d is not primen", i);
else printf("%d is primen", i);
}
return 0;
}
这一行:
A[j - 1] = 1;
应:A[j] = 1;
所以,现在应该运行良好:
#include<stdio.h>
int A[1000000];
void sieve(int till)
{
for(int i = 2; i < till; i++)
{
if(A[i] == 0)
{
for(int j = i*i; j < till; j+=i)
{
A[j] = 1;
}
}
}
}
int main()
{
int N,i;
scanf("%i", &N);
for (i = 0;i < N;i++)
A[i] = 0;
sieve(N);
for (i = 2;i < N;i++)
if (A[i])
printf("%i is not primen",i);
else
printf("%i is primen",i);
}
你的代码有很多问题。
-
int A[1000000];
没有初始化数组。您应该初始化
A[0]=1
,A[1]=1
和所有其他索引为0
。 -
for(int j = i*i; j < till; j+=i)
i*i
可能导致整数溢出。您可能应该使用j=i+i
来减少溢出的可能性。 -
A[j - 1] = 1;
不确定是否使用了正确的数组索引。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么stream::忽略未按预期工作