Pascal生成前N个素数存入数组运行无输出问题排查
代码存在的问题
isPrime函数逻辑错误- 当输入参数
a=2时,循环范围2 to round(sqrt(2))等价于2 to 1,循环不会执行,函数返回值未初始化,默认会判定2为非素数 - 循环逻辑存在漏洞:只要有一次取余不为0就设置返回值为true,未提前处理边界值,建议循环开始前先设置
isPrime := true,只要发现能整除的因子就设为false并直接跳出循环即可
- 当输入参数
printPrime过程存储逻辑错误判定当前数为素数后,不应该用循环给数组所有位置赋值,这会导致第一个素数就填满整个数组,且
primeCount直接累加到上限,循环直接终止。正确逻辑是找到素数后,只给df[primeCount+1]赋值,primeCount仅加1次- 主程序缺失输出逻辑
调用完
printPrime过程后没有任何打印数组的代码,自然不会输出结果 - 数组长度限制问题
你定义的
prime_number类型固定长度为10,输入n>10时会出现数组越界错误
修正后可运行代码
program prime; type // 可根据需求调整数组最大长度,这里调整为100适配更大的n prime_number = array [1..100] of Integer; var dataset:prime_number; n,i:Integer; function isPrime(a:Integer): Boolean; var i: Integer; begin if a <= 1 then begin isPrime := false; exit; end; if a = 2 then begin isPrime := true; exit; end; isPrime := true; for i := 2 to round(sqrt(a)) do begin if(a mod i = 0) then begin isPrime:=false; break; end; end; end; procedure printPrime(a:Integer;var df:prime_number); var number,primeCount: Integer; begin number:=2; primeCount:=0; while (primeCount < a) do begin if(isPrime(number)) then begin primeCount:=primeCount+1; df[primeCount]:=number; end; number:=number+1; end; end; begin write('Enter n: ');read(n); printPrime(n,dataset); // 新增数组输出逻辑 write('['); for i := 1 to n do begin if i > 1 then write(','); write(dataset[i]); end; writeln(']'); end.
内容的提问来源于stack exchange,提问作者Dio Brando
相关产品推荐
相关产品推荐

