79 lines
1.4 KiB
ObjectPascal
79 lines
1.4 KiB
ObjectPascal
program DuffinianNumbers;
|
|
|
|
CONST
|
|
MaxSigma = 10000;
|
|
|
|
VAR
|
|
seen, cur: CARDINAL;
|
|
sigma: ARRAY [1..MaxSigma] OF CARDINAL;
|
|
|
|
PROCEDURE CalculateSigmaTable;
|
|
VAR i, j: CARDINAL;
|
|
BEGIN
|
|
FOR i := 1 TO MaxSigma DO
|
|
BEGIN
|
|
sigma[i] := 0
|
|
END;
|
|
FOR i := 1 TO MaxSigma DO
|
|
BEGIN
|
|
j := i;//2*i -> sigma(n)-n
|
|
WHILE j <= MaxSigma DO
|
|
Begin
|
|
INC(sigma[j], i);
|
|
INC(j, i);
|
|
END
|
|
END
|
|
END;// CalculateSigmaTable;
|
|
|
|
FUNCTION GCD(a, b: CARDINAL): CARDINAL;
|
|
VAR c: CARDINAL;
|
|
BEGIN
|
|
WHILE b <>0 DO
|
|
Begin
|
|
c := a MOD b;
|
|
a := b;
|
|
b := c
|
|
END;
|
|
EXIT(A)
|
|
END;// GCD;
|
|
|
|
function IsDuffinian(n: CARDINAL): BOOLEAN;
|
|
BEGIN
|
|
EXIT( (sigma[n] > n+1) AND (GCD(n, sigma[n]) = 1))
|
|
END;// IsDuffinian;
|
|
|
|
FUNCTION IsDuffinianTriple(n: CARDINAL): BOOLEAN;
|
|
BEGIN
|
|
EXIT(IsDuffinian(n) AND IsDuffinian(n+1) AND IsDuffinian(n+2));
|
|
END;// IsDuffinianTriple;
|
|
|
|
BEGIN
|
|
CalculateSigmaTable;
|
|
Writeln('First 50 Duffinian numbers:');
|
|
WriteLn;
|
|
cur := 0;
|
|
FOR seen := 1 TO 50 DO
|
|
Begin
|
|
REPEAT
|
|
INC(cur)
|
|
UNTIL IsDuffinian(cur);
|
|
Write(cur:4);
|
|
IF seen MOD 10 = 0 THEN
|
|
WriteLn;
|
|
END;
|
|
|
|
WriteLn;
|
|
WriteLn('First 15 Duffinian triples:');
|
|
WriteLn;
|
|
cur := 0;
|
|
FOR seen := 1 TO 15 DO
|
|
BEGIN
|
|
REPEAT
|
|
INC(cur)
|
|
UNTIL IsDuffinianTriple(cur);
|
|
Write(cur:6);
|
|
Write(cur+1:6);
|
|
Write(cur+2:6);
|
|
WriteLn;
|
|
END
|
|
END.// DuffinianNumbers.
|