【问题标题】:Is it prime? TI-BASIC是素数吗? TI-BASIC
【发布时间】:2014-04-09 08:10:18
【问题描述】:

您好,我正在尝试将此代码转换为 TI-BASIC。我在如何将 for 循环更改为 while 循环以及在 TI-BASIC 中增加数字时遇到问题。

#include <stdio.h>
int main()
{
  int n, i, flag=0;
  printf("Enter a positive integer: ");
  scanf("%d",&n);
  for(i=2;i<=n/2;++i)
  {
      if(n%i==0)
      {
          flag=1;
          break;
      }
  }
  if (flag==0)
      printf("%d is a prime number.",n);
  else
      printf("%d is not a prime number.",n);
  return 0;
}

【问题讨论】:

  • 您对i 的循环只需要转到sqrt(n),而不是n/2。该程序是Sieve of Eratosthenes的实现。
  • 似乎之前没有提到过,因此:TI 计算器(至少在 OS 版本 3.10 中)有一个 isPrime() 函数正是这样做的。因此,除非出于教育目的,否则手动实施它是没有意义的;)

标签: primes ti-basic


【解决方案1】:

在 TI-Basic 中,While 循环按您的预期工作,您可以为其设置条件。 增加一个数字就像说一样简单

X+i->X  

其中“i”是增量器。
要将 For 循环更改为 While 循环,您必须设置 While 循环以不断检查数字和增量是否超过上限,同时增加每次运行的增量。


如果您想模仿 TI-Basic 中的 i++ 或 ++i(使用 While 循环),您只需更改代码的排列即可。请注意,TI-Basic For 语句始终在 ++i 下运行。 示例(i++):

0->X
While X<10
Disp X
X+1->X
End

这将显示(每个数字换行)

0 1 2 3 4 5 6 7 8 9

示例(++i):

0->X
While X<10
X+1->X
Disp X
End

这将显示(每个数字换行)

1 2 3 4 5 6 7 8 9 10

请注意,TI-Basic For 语句在递增时比 While 循环快得多,并且几乎总是被认为更适合该任务。


整合 Timtech 跳过偶数的想法有效地减少了检查数字素数所需的时间,只需添加几行额外的行。 我扩展了这个想法,跳过了 2 的倍数和 3 的倍数。

Input "Number:",X:abs(X->X
0
If not(fPart(X/2)) or not(fPart(X/3:Return
For(B,5,sqrt(X),6)
If not(fPart(X/B)) or not(fPart((X+2)/B:Return
End
1
  • 测试编号:1003001
  • 所需时间:~4 秒(比 15 秒好得多:D)
  • 大小:65 字节

【讨论】:

  • 第一行的abs(X 应该做什么?另外,我认为您应该运行While 循环,以便循环在检测到一个因素时立即停止,而不是测试从 2 到 √X 的所有数字(可能非常大)。
  • 实际上,是的,while 循环将充当循环的中断。在 TI-Basic 中,for 循环在时间方面通常要优越得多,为此目的,任何更改都只是有一个 goto 命令来中断。我将修改代码,使其在找到因素后立即中断,同时保持当前的效率。
  • 仅供参考:使用Goto 命令突破任何需要End 命令的块会导致内存泄漏,因此不推荐使用。
  • 我知道这一点,但除非在循环中使用它,否则会随着时间的推移产生影响并最终导致内存错误,它不会对单个循环造成任何明显影响素数测试。如果它在循环内使用,则将该程序用作子例程,并在找到因子时返回。我目前正在运行定时测试以将 for 循环版本与 while 循环版本进行比较。我会返回结果。
  • 给定素数:1003001 使用 while 循环:时间:~30 秒 使用 for 循环:时间:~16 秒 所以,我修改了代码,以便它可以用作一个函数不使用 Goto-Lbl 的较大程序,该程序应该仍然能够独立工作。 (0 表示非素数,1 表示素数)答案将存储在 Ans 中。
【解决方案2】:

在这种情况下,您可以有效地使用 While 循环:

Input "NUMBER: ",A
1->B
3->I
√(A->D
If not(fPart(A/2
DelVar BWhile I<=D and B
fPart(A/I->B
I+2->I
End
If not(B
Disp "NOT
Disp "PRIME

【讨论】:

  • @SentherusArgentum 是的!它使它更有效率。
【解决方案3】:

我不明白为什么要像 ti-basic 的 for 循环那样使用 while 循环:

0->F
Input "ENTER NUMBER:",N
For(I,2,int(N/2
If N/I=int(N/I
Then
int(N/2->I
1->F
End
End

If F
Then
Disp "NUMBER IS PRIME
Else
Disp "NUMBER IS NOT PRIME
End

N/I=int(N/I 是一种检查数字余数的方法(另一种说法是 N%I==0 但 ti basic 没有模数)。这里的另一个技巧是将 I 设置为其最大界限 (int(N/2),就像其他语言一样,这是一种“中断”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多