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;