高分求解释,

lizhongkun 2002-05-19 06:45:17
请解释以下代码,
{$R-,S-,Q-,O+}//求100亿以内的素数
{$APPTYPE CONSOLE}

program prime;

uses
sysutils;

const
maxlen3 = 1000;
dn = int64(10) shl 30;
dm = 7;

var
primes: array[1 .. maxlen3] of integer;
v: array of integer;
mark: array of boolean;
m, ans, Q, phiQ: integer;
n, len2, len3, sum: int64;
start: TDateTime;

procedure init;
var
l, k, s, max, sqmax: integer;
p: int64;
begin

max := round(exp(2 / 3 * ln(1.0 * n))) + 1;
sqmax := round(sqrt(max));
setlength(mark, max);
for s := 2 to sqmax do
if not mark[s] then
begin
k := s * s;
while k < max do
begin
mark[k] := true;
k := k + s;
end;
end;

l := 0; p := 2;
while p * p * p <= n do
begin
if not mark[p] then
begin
l := l + 1;
primes[l] := p;
end;
p := p + 1;
end;
len3 := l;

k := max - 1; sum := 0; s := 0;
while p * p <= n do
begin
if not mark[p] then
begin
l := l + 1;
while p * k > n do
begin
if not mark[k] then
s := s + 1;
k := k - 1;
end;
sum := sum + s;
end;
p := p + 1;
end;
len2 := l;

while p < max do
begin
if not mark[p] then
l := l + 1;
p := p + 1;
end;

sum := (len2 - len3) * l - sum;
sum := len3 * (len3 - 1) div 2 - len2 * (len2 - 1) div 2 + sum;

Q := 1;
phiQ := 1;
if len3 < dm then
m := len3
else
m := dm;
for s := 1 to m do
begin
Q := Q * primes[s];
phiQ := phiQ * (primes[s] - 1);
end;

setlength(v, Q);
for s := 0 to Q - 1 do
v[s] := s;
for s := 1 to m do
for k := Q - 1 downto 0 do
v[k] := v[k] - v[k div primes[s]];

end;

function phi(x: int64; a: integer): int64;
begin

if a = m then
begin
result := (x div Q) * phiQ + v[x mod Q];
exit;
end;

if x < primes[a] then
begin
result := 1;
exit;
end;

result := phi(x, a - 1) - phi(x div primes[a], a - 1);

end;

var
s: string;
begin
writeln('calc pi(n)');
write(format('n (default = %d) = ', [dn]));
try
readln(s);
n := strtoint64(s);
except
n := dn;
end;

start := now;
init;
ans := phi(n, len3) - sum + len3 - 1;

writeln(format('pi(%d) = %d (%.2fs)',
[n, ans, (now - start) * SecsPerDay]));
writeln('Press enter');
readln;
end.具体请看:
http://www.csdn.net/expert/topic/733/733996.xml?temp=.6040003
www.csdn.net/expert/topic/417/417110.xml?temp=.3694422

...全文
142 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
firebing 2002-06-05
  • 打赏
  • 举报
回复
程序太长了,
ekuan 2002-05-26
  • 打赏
  • 举报
回复
我来了!!
上海老李 2002-05-19
  • 打赏
  • 举报
回复
哪不对就说出来,太长

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧