什么是 Float Point Exception
异常代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
const int N = 1000005;
bool st[N];
int primes[N], cnt;
int main()
{
cin >> n;
for(int i = 2; i <= n; ++i){
if(!st[i]) primes[++cnt] = i;
for(int j = 0; primes[j] <= n / i; ++j){
st[primes[j] * i] = true;
if(i % primes[j] == 0) break;
}
}
cout << cnt << endl;
}
出错解析
异常就在于这两行代码:
我们存储质数是先
+
+
c
n
t
++cnt
++cnt,再存数,所以是从第
1
1
1 位开始存,那么第
0
0
0 位未赋值就为
0
0
0 (堆区)。所以我们后面对质数取余操作时,由于
j
j
j 从
0
0
0 开始计数,所以会出现%0
的情况,所以浮点异常。
解决方案
经上分析,解决方案有两个:
primes[]
从 0 0 0 开始存质数。
for(int i = 2; i <= n; ++i){
if(!st[i]) primes[cnt++] = i;
for(int j = 0; primes[j] <= n / i; ++j){
st[primes[j] * i] = true;
if(i % primes[j] == 0) break;
}
}
j
从 1 1 1 开始往后遍历。
for(int i = 2; i <= n; ++i){
if(!st[i]) primes[++cnt] = i;
for(int j = 1; primes[j] <= n / i; ++j){
st[primes[j] * i] = true;
if(i % primes[j] == 0) break;
}
}