【问题标题】:Prime factorization program (TI-84+)素数分解程序 (TI-84+)
【发布时间】:2015-01-28 02:33:37
【问题描述】:

我正在我的计算器上制作一个素数分解程序。它适用于较小的数字,但对于 2^n,n≥47,它显示出奇怪的行为。它会在一段时间内运行良好,但在某些时候程序会崩溃,并在吐出素数 17 和 353 后,会一直运行下去。

由于我的编程知识极其有限,我怀疑计算器无法准确地处理这么大的数字并弄乱程序。

代码如下:(变量解释如下;以 A+Bi 的形式输出质因数,用于 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)

要重现此问题,请运行程序并输入任意 2^n 以表示 n≥47。

有人知道为什么会这样吗?

【问题讨论】:

    标签: prime-factoring ti-basic


    【解决方案1】:

    你的假设是正确的。 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
    

    【讨论】:

    • 实际上,→0DelVar 更可取,因为DelVar(2 个字节)占用相同数量的空间,但比→0 慢。
    • @user3932000 我明白你想说什么了,但是你忘记了当使用DelVar 时,下面的冒号可以去掉。因此,每次适当的使用比→0 节省一个字节,速度差异可以忽略不计。
    猜你喜欢
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多