素数代码 - 请帮我解决这个错误(如果'缺少'?)

Sai*_*tap 2 oracle plsql

SQL> ed
Wrote file afiedt.buf

  1  declare
  2  n number;
  3  i number;
  4  counter number;
  5  begin
  6  n:=&n;
  7  i:=1;
  8  counter:=0;
  9  if n=1
 10     then dbms_output.put_line('1 is a prime No.');
 11  else if n=2
 12     then dbms_output.put_line('2 is even prime');
 13  else
 14      for i in 1..n loop
 15     if mod(n,i)=0
 16              then counter:=counter+1;
 17             end if;
 18     end loop;
 19  end if;
 20  if counter=2
 21     then dbms_output.put_line(n||' is a prime No.');
 22  else
 23     dbms_output.put_line(n||' is a not prime No.');
 24  end if;
 25* end
Run Code Online (Sandbox Code Playgroud)

我得到以下错误,我不明白.任何人都可以解释是什么导致它?

SQL> /
Enter value for n: 8
old   6: n:=&n;
new   6: n:=8;
end
  *
ERROR at line 25:
ORA-06550: line 25, column 3:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the
following:
if
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 7

这是因为这个代码段,格式化为更好地理解为什么:

 9  if n=1
10  |  then dbms_output.put_line('1 is a prime No.');
11  else
    | if n=2
12  | | then dbms_output.put_line('2 is even prime');
13  | else
14  | | for i in 1..n loop
15  | | | if mod(n,i)=0
16  | | | | then counter:=counter+1;
17  | | | end if;
18  | | end loop;
19  | end if;
    ?
Run Code Online (Sandbox Code Playgroud)

换句话说,该部分缺少一个end if.这就是为什么,当你在第25行完成你的文件时end,它会抱怨没有if它(制作end if).

只需end if紧接第19行即可解决问题.


这应该可以解决您当前的问题,但我也有一些快速评论.

  • 如果你使用for i in 2..n loop(从2开始而不是1),并且测试counter大于1(而不是等于2),那应该可以节省一些工作.mod(n,1)所有人来说 都是零n.
  • 在任何情况下,原始测试应该是大于 2,不等于:数字12会给你一个counter5(每个1,2,3,4和6一个),因此将被视为非素数.
  • 为了提高效率,你应该记住,你只需要检查trunc(sqrt(n))+1(或者使用你所使用的任何语言的等效物),因为如果一个数字高于那个因素,你就会找到它的对:12 mod 4是零,但你已经发现它的3对(12 mod(12/4)为零).
  • 确保2..n不包括,n因为mod操作也会增加计数器(我不知道你的特定语言如何处理该循环结构) - 它可能必须2..n-1.