9176번 - 메르센 합성수
동작은 하지만 시간초과가 발생하는데, for문안에 while문이 문제인것 같습니다. 어떻하면 시간복잡도를 개선할 수 있을까요??
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
int ptr = 0;
int[] prime = new int[n];
//소수를 배열에 저장하는 부분
prime[ptr++] = 2;
prime[ptr++] = 3;
for (int i = 5; i <= n; i += 2) {
boolean flag = false;
for (int j = 1; prime[j] * prime[j] <= i; j++)
if (i % prime[j] == 0) {
flag = true;
break;
}
if (!flag) {
prime[ptr++] = i;
//소수를 이용해 메르센 합성수를 구하는 부분
for (int i = 0; i < prime.length; i++) {
int ptr2 = 3;
while (true) {
if ((Math.pow(2, prime[i]) - 1) % ptr2 == 0) {
int num = (int) ((Math.pow(2, prime[i]) - 1) / ptr2);
if (num == 1) {
System.out.println(ptr2 + " * " + num + " = " + (int) (Math.pow(2, prime[i]) - 1) + " = " + "( 2 ^ "
+ prime[i] + " ) - 1");
ptr2 += 2;
if(ptr2 == Math.pow(2, prime[i])/2) {
댓글을 작성하려면 로그인해야 합니다.
bravery0730 3년 전
동작은 하지만 시간초과가 발생하는데, for문안에 while문이 문제인것 같습니다. 어떻하면 시간복잡도를 개선할 수 있을까요??
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
int ptr = 0;
int[] prime = new int[n];
//소수를 배열에 저장하는 부분
prime[ptr++] = 2;
prime[ptr++] = 3;
for (int i = 5; i <= n; i += 2) {
boolean flag = false;
for (int j = 1; prime[j] * prime[j] <= i; j++)
if (i % prime[j] == 0) {
flag = true;
break;
}
if (!flag) {
prime[ptr++] = i;
}
}
//소수를 이용해 메르센 합성수를 구하는 부분
for (int i = 0; i < prime.length; i++) {
int ptr2 = 3;
while (true) {
if ((Math.pow(2, prime[i]) - 1) % ptr2 == 0) {
int num = (int) ((Math.pow(2, prime[i]) - 1) / ptr2);
if (num == 1) {
break;
}
System.out.println(ptr2 + " * " + num + " = " + (int) (Math.pow(2, prime[i]) - 1) + " = " + "( 2 ^ "
+ prime[i] + " ) - 1");
break;
}
ptr2 += 2;
if(ptr2 == Math.pow(2, prime[i])/2) {
break;
}
}
}
}
}