2014-11-29 4 views
3

Я делаю первую факторизацию программы на своем калькуляторе. Он отлично работает для меньших чисел, но он показывает странное поведение для 2^n, n≥47. На какое-то время это будет хорошо, но в какой-то момент программа распадается и после выплескивания простых чисел 17 и 353 продолжает работать вечно.Первичная программа факторизации (TI-84 +)

С моими крайне ограниченными знаниями в области программирования я подозреваю, что калькулятор не может справиться с таким большим количеством точно и испортить программу.

Вот код: (переменные описаны ниже; выводит простые множители в виде А + Bi для простого фактора А^В)

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)

Чтобы воспроизвести эту проблему, запустите программу и введите любое 2^n для n≥47.

Кто-нибудь знает, почему это происходит?

ответ

2

Ваша гипотеза верна. Действительный тип данных в TI-Basic может хранить до 44 бит данных (source). Это можно доказать, используя the solve(command следующим образом:

solve((X+1)-X,X,0 

ли работать как программа, называемая как подпрограмма, или выполняется с главного экрана, эта программа/функция будет выводить большое количество в аналогичном диапазоне как ваша неудачная точка (которая никогда не должна произойти, потому что X+1 никогда не будет равна X).

Кроме того, я укоротить код немного вниз:

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', так как 'DelVar' (2 байта) занимает столько же места, в то же время медленнее, чем '→ 0'. – user3932000

+1

@ user3932000 Я вижу, что вы пытаетесь сказать, но вы забыли, что, когда используется 'DelVar', можно удалить следующий двоеточие. Таким образом, каждое подходящее использование сохраняет один байт над '→ 0' с незначительной разницей в скорости. – Timtech