2014-11-29 1 views
3

저는 계산기에서 소수 분해 계산기를 만들고 있습니다. 그것은 작은 숫자에 대해 잘 작동하지만 2^n, n≥47에 대해 이상한 행동을 보입니다. 그것은 잠시 동안 괜찮을 것입니다. 그러나 어떤 시점에서 프로그램은 고장 나서 소수 17과 353을 내뱉은 후에 영원히 계속 달리고 있습니다.프라임 인수 분해 프로그램 (TI-84 +)

프로그래밍에 대한 내 지식이 극히 제한되어 있으므로 계산기가 이러한 많은 수를 정확히 처리하지 못하고 프로그램을 망칠 것으로 의심됩니다. 여기

코드이다 : (변수 후술; 출력 소인수를 A + 양성의 형태^B의 프라임 팩터)

ClrHome 
Disp "N=Number 
Input "N: ",N 
If N≥2 and not(fPart(N)):Then 
    0→dim(ʟP) 
    2→I 
    0→R 
    0→S 
    Repeat N=1 
     If not(fPart(N/I)):Then 
      While not(fPart(N/I)) 
       N/I→N 
       S+1→S 
      End 
      R+1→R 
      I+Si→ʟP(R) 
      0→S 
     End 
     I+1→I 
    End 
End 
ʟP 

#N: Number to be prime-factored (input)

#I: A prime factor

#R: Number of unique prime factors

#S: Exponent on prime factor

#ʟP: Prime factorization of N (output)

이 문제를 재현하려면 프로그램을 실행하고 n≥47 인 경우 2^n을 입력하십시오.

왜 이런 일이 발생하는지 알고 계십니까?

답변

2

귀하의 가설이 맞습니다. TI-Basic의 실수 데이터 유형은 최대 44 비트의 데이터 (source) 만 저장할 수 있습니다. 이것은 다음과 같은 방법으로 the solve(command를 사용하여 입증 할 수 있습니다

, 프로그램으로 실행 서브 프로그램이라, 또는 홈 화면에서 실행 여부
solve((X+1)-X,X,0 

,이 프로그램/기능을 출력 비슷한 범위의 많은 수의 귀하의 실패 포인트 (X+1은 결코 X과 같지 않으므로 결코 일어나지 않아야합니다). 같은 크기의 공간을 차지 DelVar` (2 바이트)`이후하면서, 실제로

ClrHome 
Prompt N 
If N≥2 and not(fPart(N:Then 
    0→dim(ʟP 
    DelVar RDelVar S2→I 
    Repeat N=1 
     If not(fPart(N/I:Then 
      While not(fPart(N/I 
       N/I→N 
       S+1→S 
      End 
      R+1→R 
      I+Si→ʟP(R 
      0→S 
     End 
     I+1→I 
    End 
End 
ʟP 
+0

,'→ 0'이 DelVar''에 바람직하다 :

또한, 나는 조금 아래 코드를 단축 → 0보다 느립니다. – user3932000

+1

@ user3932000 'DelVar'를 사용할 때 다음 콜론을 제거 할 수 있다는 것을 잊어 버렸습니다. 따라서, 적절한 각각의 사용은 무시할 수있는 속도 차이로 '→ 0'에 1 바이트를 절약합니다. – Timtech