pascal求100000以内的纯粹素数.一个素数去掉左边的任意位数字后仍然是素数的数称之为纯粹素数.

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/03 03:37:11
pascal求100000以内的纯粹素数.一个素数去掉左边的任意位数字后仍然是素数的数称之为纯粹素数.

pascal求100000以内的纯粹素数.一个素数去掉左边的任意位数字后仍然是素数的数称之为纯粹素数.
pascal求100000以内的纯粹素数.
一个素数去掉左边的任意位数字后仍然是素数的数称之为纯粹素数.

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.