0
10,000,000 미만의 소수는 664,579이지만 내 코드는 664,214 만 생성합니다. 숫자의 소스는 i*i
을 계산할 때 정수 오버 플로우가 https://primes.utm.edu/howmany.html내 코드가 소수를 올바르게 생성하지 않는 이유
#include <iostream>
#include <bitset>
#include <vector>
using namespace std;
const int N = 10000001;
bitset<N>num;
vector<int>prime;
inline void sieve()
{
num.flip();
num[0] = num[1] = 0;
for(int i=2;i<N;i++)
if(num[i])
{
prime.push_back(i);
for(long long unsigned j=i*i; j<N;j+=i)
num[j] = 0;
}
}
int main() {
sieve();
cout << prime.size() << endl;
return 0;
}
를 출력 j''의 초기화가 J '로 변경하면 = (부호 긴 길이) 나 i'을 * 정확한 출력은 출력된다. – hvd
그리고 바깥 쪽 루프의 한계가 올바르게 설정 되었다면 (sqrt (N)까지) 곱셈은 처음에는 오버플로되지 않습니다. 그것은 실사 일뿐만 아니라 바깥 쪽 루프의 반복 횟수를 몇 분의 1로 줄입니다. 참고 : 반올림 모드에 따라'sqrt()'는 아래 대신 사용할 수 있습니다; 자세한 정보를 처리하고 별도로 테스트 할 수있는 작은 함수 인'max_factor()'를 작성하는 것이 좋습니다. – DarthGizka
일반적으로 체 코드의 경우 올바른 데이터 유형 (부호없는 int)을 사용하면 경계 사례의 수가 크게 줄어들며 인덱스의 헤드 룸을 추가로 구입하기 때문에 패킹 된 (오즈 전용) 비트 맵이 사용되는 경우 더욱 그렇습니다 변수. 불필요하게 문제에 double-wide 정수를 던지는 것은 좋은 코드와 견고한 코드를 생성 할 수있는 전략이 아닙니다. 지적 게으름을 격려하는 것 말고는 코드를 더 좋게 만드는 대신 엉망이되는 경향이 있습니다. – DarthGizka