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;

}

}

}

}

}

댓글을 작성하려면 로그인해야 합니다.