回文素数新
回文素数
了解回文数
从左到右和从右到左是看一样的。
例: 1,11,121,12321,13531等
了解素数
指在一个大于1的自然数中,除
了1和此整数自身外,没法被其 他自然数整除的数。
例:
2,5,11等是素数 4,6,9等不是素数
回文素数
从左到右和从右到左是看一样的
素数。
例:
1,2,5,151等
例程(变量部分):
var
a,b,i,j,k,l,t:longint; T:text; d:array[1..10000]of longint;
例程(计算回文数部分):
d[1]:=5;d[2]:=7;d[3]:=11; (说明:由于一二位的回 文素数只有这三个, 所以直接赋值) t:=3;(控制数组坐标变量)
例程(计算回文数部分):
for i:=1 to 9 do(求七位回文数) for j:=0 to 9 do for k:=0 to 9 do for l:=0 to 9 do begin inc(t);
d[t]:=i*1000001+j*100010+k*10100+l*1000 end;
for
i:=1 to t do if (a<=d[i]) and ( d[i]<=b) then writeln(f,d[i]) else break;
例程(全1)
Program aa; var a,b,i,j,k,l,t:longint; d:array[1..10000]of longint; f:text; begin assign(f,'pprime.in'); reset(f); readln(a,b); close(f); d[1]:=5;d[2]:=7;d[3]:=11; t:=3; for i:=1 to 9 do for j:=0 to 9 do begin inc(t); d[t]:=i*101+j*10; end; for i:=1 to 9 do for j:=0 to 9 do for k:=0 to 9 do begin inc(t); d[t]:=i*10001+j*1010+k*100; end;
例程(全2)
for i:=1 to 9 do for j:=0 to 9 do for k:=0 to 9 do for l:=0 to 9 do begin inc(t); d[t]:=i*1000001+j*100010+k*10100+l*1000 end; for i:=4 to t do for j:=2 to trunc(sqrt(d[i])) do if d[i] mod j=0 then begin d[i]:=0; break; end; assign(f,'pprime.out'); rewrite(f); for i:=1 to t do if (a<=d[i]) and (d[i]<=b) then writeln(f,d[i]) else break; close(f); end.
再在回文数中找素数,此方案须遍历的数的 个数为回文数的个数(小于总共数的个数); 选择方案二:需先要遍历找所有的数找素数, 再找回文数 因此:不难看出,方案一效率更高些。
进一步优化
任意偶数长度的回文数都不可能是素数(除
11以外),因为它都能被11整除,而11却是 素数; 除2外,所有偶数均不是素数。
题目
找出范围[a,b](5
<= a < b <= 100,000,000)间的所有回文质数; 限时:0.1s
大致思路
思路一: 先找计算出所有的回文 数,再在找到的回文数 中找素数;
思路二: 先筛选出所有的素数, 再在所找到的素数中找 回文数。
选择相对优化的思路
选择方案一:只需按照规律先计算出回文数,
例程(计算回文数部分):
for
i:=1 to 9 do(求三位回文数) for j:=0 to 9 do begin inc(t); d[t]:=i*101+j*10; end;
例程(计算回文数部分):
for
i:=1 to 9 do(求五位回文数) for j:=0 to 9 do for k:=0 to 9 do begin inc(t); d[t]:=i*10001+j*1010+k*100; end;
例程(找素数部分):
for i:=4 to t do(从四开始原因:前面三个
已经是回文素数,分别是5,7,11) Nhomakorabea
for j:=2 to trunc(sqrt(d[i])) do if d[i] mod j=0 then begin d[i]:=0; break; end;
例程(找出合题意的回文素数部分):