pascal - 我的程序在 for 和 if 之间来回跳动,我不知道为什么
问题描述
我正在做一些功课,有一个问题,我必须编写一个程序来告诉我用户给出的两个数字之间有多少质数。出于某种原因,当我用 F8 测试程序时,我可以看到程序在“for”和“if”之间来回跳动,没有明显的原因。是的,我必须使用这种语言。
我尝试过重新安装 IDE,希望它只是一些错误(就像它经常发生在 Android Studio 上一样)。我不知道还能尝试什么,这是我第一次使用 Lazarus 和 PASCAL。
program PrimoEntre;
var
a, b, i, q: Integer;
begin
write('Ingrese el primer valor: ');
readln(a);
write('Ingrese el segundo valor: ');
readln(b);
for i:=a to b do //It starts bouncing back and forth from here...
begin
q:=2;
if((b>=2)AND(b<=10)) then //...to here.
begin
while((q>=2) and (q<=b)) do
begin
if(a<>b) then
begin
if((a MOD b)=0) then
begin;
//i ES NO PRIMO
if(q=b) then
begin
writeln('No existen numeros primos entre ', a, ' y ', b, '.');
end;
q:=(q+1);
end;
end
else
begin
if(q=b) then
begin
//i ES PRIMO
writeln(i, ' es primo.');;
q:=1
end;
end;
end;
end
else
begin
while((q>=2) and (b<=10)) do
begin
if(a<>b) then
begin
if((a MOD b)=0) then
begin
//i ES NO PRIMO
if(q=b) then
begin
writeln('No existen numeros primos entre ', a, ' y ', b, '.');
end;
q:=(q+1);
end;
end
else
begin
if(q=b) then
begin
//i ES PRIMO
writeln(i, ' es primo.');
q:=1
end
end;
end;
end;
end;
readln();
end.
我希望输出是以下之一:
- 控制台在每次找到 a 和 b 之间的素数时写入。
- 控制台说 a 和 b 之间没有任何素数。
相反,没有结果。该程序卡住了,我必须手动终止它。
解决方案
你说你试图在 a...b 范围内找到素数。问题是您正在以一种非常不必要的复杂方式执行此操作,而您的程序到处跳转的主要原因是您正在这样做,因为您正在使q
变量的值到处跳转。
我认为你应该做的事情是放慢速度,想想你想要做什么:
您想将范围内的整数迭代
a
到b
. 您的for
循环做得很好,其价值i
在于您正在测试素数。我将把它称为你的外for
循环。你出错的地方是不必要地执行一个
while
循环来测试素数。一旦确定了要测试的
i
值,您要做的就是测试是否存在i
除 1 或 之外的任何因子i
。为此,您可以使用一个简单的内部for
循环,该循环迭代一个值j
(所谓的以避免与您的混淆q
)来使用测试确定是否可被零余数i
整除:如果是,则继续没有意义内部,循环。j
mod
j
接下来要考虑的是循环的上限应该是多少
for j := ... to ...
。j
考虑大于平方根的值是没有意义的,i
因为很明显,如果i
有一个大于它的整数因子,它也必须有一个更低的值。如果
j
循环在没有找到因子的情况下完成,i
则为素数。
尝试编写内部j
循环,您将看到结果比现有代码简单得多(并且更可预测),并且编码错误的机会非常少,而且调试起来也非常简单,因为执行只是“失败”通过它的每个值i
。
顺便说一句,我完全同意@TomBrunberg 将结构化编码作为一个一般命题,但我认为for
你在这里需要的两个嵌套循环并不需要分成不同的过程/函数,尽管你可以尝试一下,一旦你得到了代码正常工作。
推荐阅读
- r - 在 R 中选择第一次出现的日期时保持空单元格
- python - 如何在 Python 中对数字求平方,并以列表形式输出
- python - 如何移动pygame精灵
- python - python虚拟环境中的默认PIP是古老的,如何修复它?
- apache - Apache OpenID Connect 提前刷新令牌
- c++ - 为什么写空的 std::istringstream.rdbuf() 会设置失败位?
- javascript - 在渲染函数 React Redux 中未使用属性时防止组件重新渲染
- javascript - src dataId 值到 dest newDataId 它没有复制
- java - 如何改进抓取算法的图像分割?
- c++ - 了解 Google 基准测试结果