68 lines
1.6 KiB
Text
68 lines
1.6 KiB
Text
include "cowgol.coh";
|
|
|
|
const MAX := 13000;
|
|
|
|
var divisorSum: uint16[MAX+1];
|
|
var divisorCount: uint8[MAX+1];
|
|
|
|
sub CalculateDivisorSums() is
|
|
MemZero(&divisorSum[0] as [uint8], @bytesof divisorSum);
|
|
MemZero(&divisorCount[0] as [uint8], @bytesof divisorCount);
|
|
|
|
var div: @indexof divisorSum := 1;
|
|
while div <= MAX loop
|
|
var num := div;
|
|
while num <= MAX loop
|
|
divisorSum[num] := divisorSum[num] + div;
|
|
divisorCount[num] := divisorCount[num] + 1;
|
|
num := num + div;
|
|
end loop;
|
|
div := div + 1;
|
|
end loop;
|
|
end sub;
|
|
|
|
sub NextArithmetic(n: uint16): (r: uint16) is
|
|
r := n + 1;
|
|
while divisorSum[r] % divisorCount[r] as uint16 != 0 loop
|
|
r := r + 1;
|
|
end loop;
|
|
end sub;
|
|
|
|
sub Composite(n: uint16): (r: uint8) is
|
|
r := 0;
|
|
if n>1 and divisorSum[n] != n+1 then
|
|
r := 1;
|
|
end if;
|
|
end sub;
|
|
|
|
var current: uint16 := 0;
|
|
var nth: uint16 := 0;
|
|
var composites: uint16 := 0;
|
|
|
|
CalculateDivisorSums();
|
|
|
|
print("First 100 arithmetic numbers:\n");
|
|
while nth < 10000 loop
|
|
current := NextArithmetic(current);
|
|
nth := nth + 1;
|
|
composites := composites + Composite(current) as uint16;
|
|
|
|
if nth <= 100 then
|
|
print_i16(current);
|
|
if nth % 5 == 0 then
|
|
print_nl();
|
|
else
|
|
print_char('\t');
|
|
end if;
|
|
end if;
|
|
|
|
if nth == 1000 or nth == 10000 then
|
|
print_nl();
|
|
print_i16(nth);
|
|
print(": ");
|
|
print_i16(current);
|
|
print("\t");
|
|
print_i16(composites);
|
|
print(" composites\n");
|
|
end if;
|
|
end loop;
|