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

时间:2011-01-30 10:50:29

标签: 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

我收到以下错误,我不明白。任何人都可以解释导致它的原因吗?

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

7 个答案:

答案 0 :(得分: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;
    ?

换句话说,该部分缺少end if。这就是为什么当你使用end在第25行完成文件时,它会抱怨后面没有if(使end if)。

在第19行之后立即敲打end if,然后修复它。


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

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

答案 1 :(得分:4)

我认为您正在寻找PL / SQL ELSIF关键字。我拿了你的代码,替换了

else if n=2

在第11行

elsif n=2

并且有效。

答案 2 :(得分:2)

对于每个IF,我们应该使用END IF;

关闭它

但是当我们使用ELSEIF时,就足够了。

IF
  ......
  ELSEIF
  ......
END IF;

IF
  ......
   ELSE IF
   .......
   END IF;
END IF;

答案 3 :(得分:1)

1)在第25行的最后end之后你需要一个分号.2)然后你得到另一个错误,(参见下面的注释1)并且需要用elsif代替{{ 1)}在第11行.3)最后,1不是素数,第10行也需要校正,else if所以纠正的代码是:

then dbms_output.put_line('1 is neither prime nor composite.);

此外,请参阅paxdiablo's答案,了解有关根据素数改进此代码的其他说明。


注1:第二种语法错误如下:

SQL> 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 neither prime nor composite.');
 11      elsif 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;
 26  /
Enter value for n: 3
old   6:     n:=&n;
new   6:     n:=3;
3 is a prime No.

PL/SQL procedure successfully completed.

答案 4 :(得分:0)

DECLARE 
   N NUMBER:=&N;
   V_COUNT NUMBER:=0;
BEGIN
  FOR I IN 1..N LOOP
    IF MOD(N,I)=0 THEN
      V_COUNT:=V_COUNT+1;
    END IF;
  END LOOP;
  IF V_COUNT<=2 THEN
     DBMS_OUTPUT.PUT_LINE(N||' ' ||'IS PRIME NUMBER');
   ELSE
     DBMS_OUTPUT.PUT_LINE(N||' '||' IS NOT  PRIME NUMBER');
  END IF;  
END;

答案 5 :(得分:0)

declare
  n       number;
  i       number;
  counter number;
begin
  n       := &n;
  i       := 1;
  counter := 0;
  if n = 1 then
    dbms_output.put_line('1 is a prime No.');
  elsif n = 2 then
    dbms_output.put_line('2 is even prime');
  else
    for i in 1 .. n loop
      if mod(n, i) = 0 then
        counter := counter + 1;
      end if;
    end loop;
  end if;

  if counter = 2 then
    dbms_output.put_line(n || ' is a prime No.');
  else
    dbms_output.put_line(n || ' is a not prime No.');
  end if;

end;

答案 6 :(得分:0)

素数检查。

DECLARE
  N NUMBER :=&N;
  I NUMBER;
  COUNTER NUMBER :=0;
BEGIN
  FOR I IN 1..N LOOP
  IF(MOD(N,I) =0) THEN
  COUNTER :=COUNTER+1;
END IF;
END LOOP;
IF (COUNTER =2) THEN
DBMS_OUTPUT.PUT_LINE(N ||'  '||'IS PRIME NUMBER');
ELSE
DBMS_OUTPUT.PUT_LINE(N ||'  '||'IS NOT A  PRIME NUMBER');
END IF;
END;