质因数分解程序(TI-84+)

4
我正在为我的计算器制作找质因数程序。它对于较小的数字工作得很好,但是对于 2^n, n≥47 的情况表现出奇怪的行为。它在一段时间内工作正常,但是在某个点上,程序会崩溃,并在输出了质数17和353后一直运行。
由于我在编程方面极其有限的知识,我怀疑计算器无法准确处理如此大的数字,从而破坏了程序。
以下是代码:(下面解释了变量;以 A^B 形式输出质因数的形式为 A+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: 需要进行质因数分解的数字(输入)

#I: 一个质因子

#R: 唯一质因子的数量

#S: 质因子的指数

#ʟP: N的质因数分解结果(输出)

要重现此问题,请运行程序并输入任何2^n,其中n≥47。

有人知道为什么会发生这种情况吗?

1个回答

3
你的假设是正确的。在TI-Basic中,实数数据类型只能存储最多44位数据(source)。这可以通过以下方式使用solve(命令)来证明:
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

实际上,→0DelVar更可取,因为DelVar(2个字节)占用相同的空间,而速度比→0慢。 - user3932000
1
@user3932000 我明白你想说什么,但是你忘记了当使用 DelVar 时,后面的冒号可以省略。因此,每个适当的使用都比 →0 节省一个字节,在速度上几乎没有区别。 - Timtech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接