质数代码 - 请帮我解决这个错误('missing if'?)

Posted

技术标签:

【中文标题】质数代码 - 请帮我解决这个错误(\'missing if\'?)【英文标题】:Prime number code - please help me in solving this error ('missing if'?)质数代码 - 请帮我解决这个错误('missing if'?) 【发布时间】:2011-01-30 10:50:28 【问题描述】:
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

【问题讨论】:

请解释您的问题 - 您希望您的代码做什么以及它没有做什么? 注意:1 通常不被认为是素数。见:mathworld.wolfram.com/PrimeNumber.html。 “素数......是一个正整数 p > 1,除了 1 和它本身之外没有正整数除数。”并且“数字 1 是一种特殊情况,它既不是素数也不是复合数(Wells 1986, p. 31)。虽然数字 1 曾经被认为是素数(Goldbach 1742; Lehmer 1909, 1914; Hardy and Wright 1979, p . 11; Gardner 1984, pp. 86-87; Sloane and Plouffe 1995, p. 33; Hardy 1999, p. 46)。” 【参考方案1】:

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

 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。这就是为什么,当您在第 25 行使用 end 完成文件时,它会抱怨后面没有 if(以生成 end if)。

只需在第 19 行之后立即敲击 end if 即可修复它。


这应该可以解决您当前的问题,但我也有几个快速的 cmets。

如果您使用for i in 2..n loop(从 2 开始而不是 1),并测试 counter 大于 1(而不是等于 2),那应该可以节省一些工作。对于所有 nmod(n,1) 为零。 在任何情况下,原始测试应该是大于 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 操作也会增加计数器(我不知道您的特定语言如何处理该循环构造)-它可能 em> 必须是 2..n-1

【讨论】:

有帮助,但最终错过了报告的语法错误,即第 25 行缺少的分号。当该错误得到纠正时,报告的 if 问题。此外,“无论如何,原始测试应该大于 2,不等于……”是不正确的。由于循环是 1..N mod(n,i)=0 发生两次素数,一次是 i=1,一次是 i=N。当然循环被缩短到只去 N 的平方根然后最终测试将不得不改变。 检查 mod(n,1) 是浪费时间,因为它总是为零。我的观点是最好从 2 开始并调整计数检查。并且报告的错误是 not 缺少分号,这是一个不平衡的if 语句 - 这很明显,因为它声明:“期望以下之一:如果”,这意味着结束必须是结束如果。一旦您修复了报告的错误,丢失的分号很可能是下一个错误,但这不是问题。 @paxdiablo:好的,启动 Oracle,平衡 if 语句,不要在最后添加分号,看看它是否有效,不会返回关于到达 end-of-file 的错误。 "我的意思是最好从 2 开始并调整计数检查。"对不起,我不明白,既然你说原始测试应该而不是,调整循环后测试应该是...... @Shannon,我并不是说这不是问题。我的意思是被报告(正如你所说)不是问题。如您的答案中的第二个代码示例所示,添加分号确实 not 修复报告的错误,它只是以不同的方式报告它,说它找到了 ; 应该在 if 的位置,而不是在那里找到end-of-file,因为很简单,您将; 放在文件末尾之前:-) 您仍然需要平衡if,使用您的解决方案或我的解决方案,它在语法方面无关紧要。【参考方案2】:

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

else if n=2

在第 11 行与

elsif n=2

它成功了。

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

1) 在第 25 行的最后一个 end 之后需要一个分号。2) 然后你会得到另一个错误,(见下面的注释 1)并且需要通过在第 11 行用 elsif 替换 else if 来纠正. 3)最后,1不是素数,第10行也需要更正,then dbms_output.put_line('1 is neither prime nor composite.);所以更正的代码是:

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.

另外,请参阅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 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;
 26  /
Enter value for n: 10
old   6:     n:=&n;
new   6:     n:=10;
end;
   *
ERROR at line 25:
ORA-06550: line 25, column 4:
PLS-00103: Encountered the symbol ";" when expecting one of the following:
if

【讨论】:

【参考方案5】:
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;

【讨论】:

很遗憾你没有花点时间解释这个【参考方案6】:
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;

【讨论】:

【参考方案7】:

质数检查。

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;

【讨论】:

以上是关于质数代码 - 请帮我解决这个错误('missing if'?)的主要内容,如果未能解决你的问题,请参考以下文章

npm install -g spray 然后出现受人尊敬的错误。请帮我解决这个问题

请帮我解决PHP代码[关闭]

我遇到了这个错误的问题:无法从“UnityEngine.ForceMode2D”转换为“UnityEngine.ForceMode”。请帮我解决它[关闭]

请帮我找出错误

请帮我理解这个“包扩展不包含任何未扩展的参数包”编译器错误

计算错误,请帮我看看?