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)
这是因为这个代码段,格式化为更好地理解为什么:
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.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.