-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathm3233 q2.java
51 lines (44 loc) · 1.56 KB
/
m3233 q2.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class Solution {
public int nonSpecialCount(int l, int r) {
int smallestVal = (int) Math.ceil(Math.sqrt(l));
int largestVal = (int) Math.floor(Math.sqrt(r));
int leftIndx = 0;
// # 2 isn't prime but is needed in this list unfort
ArrayList<Integer> primes = new ArrayList<Integer>();
primes.add(2);
primes.add(3);
primes.add(5);
int offset = 2;
int lastInt = primes.get(primes.size() - 1);
while (lastInt * lastInt <= r) {
int nextPrime = lastInt + offset;
boolean isPrime = true;
for (int prime : primes) {
if (prime * prime > nextPrime) {
break;
}
if (nextPrime % prime == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
offset = 2;
primes.add(nextPrime);
lastInt = nextPrime;
}
else
offset += 2;
}
double rooted = Math.sqrt((double) l);
int firstRoot = (int) Math.ceil(rooted);
int starterIndx = (firstRoot == 1) ? 0 : Collections.binarySearch(primes, firstRoot);
if (starterIndx <= -1) {
starterIndx = -1 - starterIndx;
}
while (!primes.isEmpty() && primes.get(primes.size() - 1) * primes.get(primes.size() - 1) > r) {
primes.remove(primes.size() - 1);
}
return r - l + 1 - (primes.size() - starterIndx);
}
}