2013-06-16 2 views
-2
import java.math.BigInteger; 
public class ProjectEuler { 
    public static void main(String[] args) { 
     BigInteger bi = new BigInteger("600851475143"); 
     int div = 7; 
     while (bi.compareTo(new BigInteger("1")) != 0) { 
      while (bi.mod(new BigInteger(div + "")).compareTo(new BigInteger("0")) == 0) { 
       bi = bi.divide(new BigInteger(div + "")); 
      } 
      div += 2; 
     } 
     System.out.println("" + div); 
    } 
} 

"의 기본 문제 중 하나를 살펴 보았습니다. 숫자 600851475143은"의 가장 큰 소수 요소는 무엇입니까? 이 솔루션이 다르다는 것을 알았습니다.이 작동 방식에 대해 몇 가지 질문이 있습니다.BigInteger에 대한 질문이 있으십니까?

  1. 첫 번째 조건은 숫자가 1인지 여부를 확인합니다. 거기에서 나는 나머지 코드를 이해할 수 없다.
  2. new BigInteger(div +""). 왜 우리는 여기에 + ""를 연결합니까?
+2

아마도 저자는 그 숫자가 2도 3도 5도 나눌 수 없다는 것을 알아 냈을 것입니다. 그것은 로켓 과학이 아닙니다. –

+0

@LuiggiMendoza : 2 초 내에 2 개의 부정적인 표현 ... – Kevin

+0

"거기에서 나머지 코드를 이해할 수 없습니다." - [BigInteger' javadocs] (http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html)에 문의 해 보았습니까? 그렇다면 이해할 수없는 * 특정 * 항목이 있습니까? – millimoose

답변

2

div = 7은 어떻게 결정됩니까?

저자는 "하드 코드"숫자 자체에 대한 지식을 처음 세 개의 소수가

첫 번째 조건 검사가 숫자가 같은지 여부 약수 중 아니라는 것을 결정하기로 한 여부 . 거기에서 나는 나머지 코드를 이해할 수 없다.

while (bi % div == 0) { 
    bi /= div; 
} 
div += 2; 

new BigInteger(div +"") 왜 우리가 여기 + ""을 만드는 간단한 방법입니다

을 연결 않습니다

코드의 나머지는 "일반"정수에서 다음과 같습니다 객체 a String. BigInteger에는 String을 사용하는 매개 변수가 있으므로이 방법의 대안은 Integer.toString(div)입니다.

이 방법이 가장 효율적인 해결책은 아닙니다. 원래 숫자의 제곱근에 도달했을 때 나누기를 멈 추면 속도가 빨라질 수 있습니다. 왜냐하면 다음 제수가 될 수 있기 때문입니다. 번호 자체.

+0

@excellent, 마지막 단락을 조금 더 설명 할 수 있겠습니까? "다음 수식이 다음 수식으로 넘어갈 것을 확신 할 수 있기 때문에 원래 수의 제곱근에 도달 할 때 나누기를 멈출 수 있음을 관찰함으로써 속도를 높일 수 있습니다. 번호 자체가 되라. " – Kevin

+1

@ 케빈 여기에서 더 잘 설명됩니다 : [Prime Factorization Calculator] (http://www.mathwarehouse.com/arithmetic/numbers/prime-number/prime-factorization-calculator.php) –

1

div = 7은 어떻게 결정됩니까? Divisibility Rules and Tests

첫 번째에게 :

아마 저자는 수가 저자는이, 그/그녀가이 규칙을 알고 있어야 않았다 방법을 알고 2 나 3이나 5로 나누어없는 것으로 나타났습니다 조건은 숫자가 1인지 여부를 확인합니다. 거기에서 나는 나머지 코드를 이해할 수 없다.

저자

는 수 분할 및 루프 반복에서 bi에 결과를 저장 이후 수가 BigInteger("1") 아닌 것을 확인한다. 이 참고 :

bi = bi.divide(new BigInteger(div + "")); 

new BigInteger(div +"")합니다. 왜 우리는 여기에 + ""를 연결합니까?

BigInteger(String) 생성자를 사용합니다. 작성자 n-a-i-v-e-l-y-는 String이 비어있는 을 추가하여 int을 추가하여 만듭니다.

관련 문제