作业帮 > 综合 > 作业

pascal求100000以内的纯粹素数.

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/10 12:10:55
pascal求100000以内的纯粹素数.
一个素数去掉左边的任意位数字后仍然是素数的数称之为纯粹素数.
非常简单,因为素数很少,先用普通的筛法筛选出100000以内的素数,缩小范围,然后逐一消去最左边数字进行判断(也可以利用上一步筛选结果提高效率,较复杂就不写了):
program PurePrime;
var
buf: array[2..100000] of Boolean;
i, j, k, m: Integer;
begin
//用筛法求出普通素数
for i := Low(buf) to High(buf) do buf[i] := True;
i := Low(buf);
while i < High(buf) do
begin
if buf[i] then
for j := i + 1 to High(buf) do
if buf[j] and (j mod i = 0) then buf[j] := False;
Inc(i);
end;
//在普通素数中筛选纯粹素数
while i > Low(buf) do
begin
if buf[i] then
begin
j := i;
while j > 0 do
if buf[j] then
begin
//开始消去最左边的数字
k := j; //k记录过程数据
m := 0; //m记录10的几次幂
while k > 10 do
begin
k := k div 10;
Inc(m);
end;
while m > 0 do
begin
k := k * 10;
Dec(m);
end;
Dec(j, k);
end
else begin //如果消去左边数字后为合数,终止循环
buf[i] := False;
j := 0;
end;
end;
Dec(i);
end;
//打印结果
for i := Low(buf) to High(buf) do
if buf[i] then Write(i, ' ');
Readln;
end.
再问: 短一点,ok?
再答: 1、程序长不代表效率低,程序短不代表效率高,这是刚接触编程的人常常忽略的事实。
2、打个比方,这个程序里,去掉素数最左边的数,顺序调用Str(整数转字符串)、StrLCopy(取得第1位以后的字串)、Val(字串转回整数)三个函数就可以实现,表面可以比我的程序短的多。但你知道Str、StrLCopy、Val三个函数展开之后多长么?如果再加个while循环效率有多低下么?
3、如果一个100行的代码比调用一个函数执行效率还高,我会选择自己写那100行代码,小白们可能会选择后者,OK?