2014-09-30 1 views
0

프로젝트 오일러로 시작했습니다.Mod를 사용할 때 큰 숫자로 오버 플로우하는 것을 피하십시오.

문제점 # 3을 완료했지만 내 endNumber를 71 * 486847 (수동 계산)으로 설정하여 완료 할 수있었습니다. endNumber = 600851475143으로 설정할 때 오버플로 오류가 발생합니다.

나는 심지어 endNumber를 Long으로 설정하고 심지어 Double로 계산할 수있는 숫자가 충분하다고 생각합니다.

여기에 전체 코드를 게시 할 수 없으므로 다른 사람들이 더 큰 숫자를 처리하기 위해 편집 방법을 보여줄 수 있기를 희망합니다.

또한 "#"은 내 코드가 아래와 같이 매우 큰 숫자를 나타낼 때 나타납니다. 긴에서 작동하도록

endNumber = 600851475143# 
     countFactor = 0 

     For i = 2 To endNumber 
      If endNumber Mod i = 0 Then 
+0

endNumber와 i를 어떤 데이터 유형으로 선언 했습니까? – Rory

답변

1

오버 플로우를 할 수는 Mod 기능을하지 않습니다 있다는 것입니다 Double 변수에 숫자 600851475143를 할당에 의한 아니다 Long보다 긴 숫자를 처리하는 것 같습니다. (실제로는 전혀 보이지 않습니다.)

대안은 Mod의 매뉴얼 CALC를 사용할 수 있습니다 :

endNumber = 600851475143# 
     countFactor = 0 

     For i = 2 To endNumber 
      If endNumber - (Int(endNumber/i) * i) = 0 Then 

당신이 다음 Chip Pearson's function 내가 배운 곳이다 (유용한 하나가 될 것입니다 정기적으로 큰 숫자에 대한 Mod를 사용하려는 경우 이 주제에 대해 처음부터). Excel에 문제가 게시되었지만 Access에서 완벽하게 작동합니다.

+0

디버그를 살펴본 후, 모드가 있던 라인에서 끊어졌습니다. 나는 mod의 한계를 들여다 보지 않을 것이라고 생각했다. 그 대안은 효과가 있었고 속도를 높이기 위해 첫 줄을 ...으로 바꿨습니다. 왜냐하면 i = 2 To Round (sqr (endNumber))는 소수 문제이기 때문입니다. 즉시 해결되었습니다. 도와 줘서 고마워! – Dan

+0

나는 당신에게'sqr' 부분에 대한 힌트를 주려고 아주 유혹을 받았지만, 프로젝트 오일러 (Project Euler)의 의도에 비추어서 더 잘 생각했다. – Simon1979

+0

10,001 번째 소수와 관련하여 문제를 제기 한 후 나에게왔다. 그것은 너무 오래 걸리고 sqr는 그 시간을 상당히 줄였습니다. 도와 주셔서 다시 한 번 감사드립니다! – Dan

0

가장 높은 가능한 번호는 : 2.147.483.647
Double입니다 당신이 찾고있는하지 이잖아, 그래서 소수의 목적을위한 것입니다.

#은 셀 내부에 숫자가 표시되기 때문에 나타납니다.

또한 나는 그 루프로 무엇을하고 싶은지 알지 못합니다. 그러나 그 하나는 달리는 데 오랜 시간이 걸릴 것입니다. 당신이 취급 많은 수에 대해 찾을 수있는이 링크를

: Large Number Arithmetic

희망

관련 문제