참고 포스팅
while (temp <= (double) (b / i)) {
if (temp >= (double) (a / i)) {
answer++;
}
temp *= i;
}
기본적으로 temp * i <= b
와 같은 식으로 구현을 한 뒤 temp 값을 제곱하여 비교하지만, long 값의 범위 초과를 방지 하기 위해서 이항 정리하여 다른 형태로 구현하였습니다.( temp에 i를 곱해준 이유는 배열 크기 제한 때문에 Math.sqrt(b)를 해줬었기 때문입니다.)
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
br.close();
long a = Long.parseLong(s[0]);
long b = Long.parseLong(s[1]);
boolean[] isPrime = new boolean[(int)Math.sqrt(b) + 1];
Arrays.fill(isPrime, true);
isPrime[0] = isPrime[1] = false;
for(int i = 2; i < isPrime.length; i++){
if(!isPrime[i])
continue;
for(int j = i * 2; j < isPrime.length; j += i){
isPrime[j] = false;
}
}
int count = 0;
for(int i = 2; i < isPrime.length; i++){
if(isPrime[i]){
long tmp = i;
while(tmp <= (double)b/i){
if(tmp >=(double)a/i){
count++;
}
tmp *= i;
}
}
}
System.out.println(count);
}
}