质数代码 - 请帮我解决这个错误('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),那应该可以节省一些工作。对于所有 n
,mod(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..Nmod(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 然后出现受人尊敬的错误。请帮我解决这个问题
我遇到了这个错误的问题:无法从“UnityEngine.ForceMode2D”转换为“UnityEngine.ForceMode”。请帮我解决它[关闭]