Pythagorean triples: Difference between revisions
Content added Content deleted
m (Small changes to program; don't affect result.) |
(Added solution for Action!) |
||
Line 208: | Line 208: | ||
Max Perimeter: 100000, Total: 64741, Primitive: 7026 |
Max Perimeter: 100000, Total: 64741, Primitive: 7026 |
||
Max Perimeter: 1000000, Total: 808950, Primitive: 70229 |
Max Perimeter: 1000000, Total: 808950, Primitive: 70229 |
||
</pre> |
|||
=={{header|Action!}}== |
|||
<lang Action!>DEFINE PTR="CARD" |
|||
DEFINE ENTRY_SIZE="3" |
|||
TYPE TRIPLE=[BYTE a,b,c] |
|||
TYPE TRIPLES=[ |
|||
PTR buf ;BYTE ARRAY |
|||
BYTE count] |
|||
PTR FUNC GetItemAddr(TRIPLES POINTER arr BYTE index) |
|||
PTR addr |
|||
addr=arr.buf+index*ENTRY_SIZE |
|||
RETURN (addr) |
|||
PROC PrintTriples(TRIPLES POINTER arr) |
|||
INT i |
|||
TRIPLE POINTER t |
|||
FOR i=0 TO arr.count-1 |
|||
DO |
|||
t=GetItemAddr(arr,i) |
|||
PrintF("(%B %B %B) ",t.a,t.b,t.c) |
|||
OD |
|||
RETURN |
|||
PROC Init(TRIPLES POINTER arr BYTE ARRAY b) |
|||
arr.buf=b |
|||
arr.count=0 |
|||
RETURN |
|||
PROC AddItem(TRIPLES POINTER arr TRIPLE POINTER t) |
|||
TRIPLE POINTER p |
|||
p=GetItemAddr(arr,arr.count) |
|||
p.a=t.a |
|||
p.b=t.b |
|||
p.c=t.c |
|||
arr.count==+1 |
|||
RETURN |
|||
PROC FindTriples(TRIPLES POINTER res BYTE limit) |
|||
BYTE ARRAY data(100) |
|||
BYTE half,i,j,k |
|||
TRIPLE t |
|||
Init(res,data) |
|||
half=limit/2 |
|||
FOR i=1 TO half |
|||
DO |
|||
FOR j=i TO half |
|||
DO |
|||
FOR k=j TO limit |
|||
DO |
|||
IF i+j+k<limit AND i*i+j*j=k*k THEN |
|||
t.a=i t.b=j t.c=k |
|||
AddItem(res,t) |
|||
FI |
|||
OD |
|||
OD |
|||
OD |
|||
RETURN |
|||
BYTE FUNC Gcd(BYTE a,b) |
|||
BYTE tmp |
|||
IF a<b THEN |
|||
tmp=a a=b b=tmp |
|||
FI |
|||
WHILE b#0 |
|||
DO |
|||
tmp=a MOD b |
|||
a=b b=tmp |
|||
OD |
|||
RETURN (a) |
|||
BYTE FUNC IsPrimitive(TRIPLE POINTER t) |
|||
IF Gcd(t.a,t.b)>1 THEN RETURN (0) FI |
|||
IF Gcd(t.b,t.c)>1 THEN RETURN (0) FI |
|||
IF Gcd(t.a,t.c)>1 THEN RETURN (0) FI |
|||
RETURN (1) |
|||
PROC FindPrimitives(TRIPLES POINTER arr,res) |
|||
BYTE ARRAY data(100) |
|||
INT i |
|||
TRIPLE POINTER t |
|||
Init(res,data) |
|||
FOR i=0 TO arr.count-1 |
|||
DO |
|||
t=GetItemAddr(arr,i) |
|||
IF IsPrimitive(t) THEN |
|||
AddItem(res,t) |
|||
FI |
|||
OD |
|||
RETURN |
|||
PROC Main() |
|||
DEFINE LIMIT="100" |
|||
TRIPLES res,res2 |
|||
FindTriples(res,LIMIT) |
|||
PrintF("There are %B pythagorean triples with a perimeter less than %B:%E%E",res.count,LIMIT) |
|||
PrintTriples(res) |
|||
FindPrimitives(res,res2) |
|||
PrintF("%E%E%E%B of them are primitive:%E%E",res2.count) |
|||
PrintTriples(res2) |
|||
RETURN</lang> |
|||
{{out}} |
|||
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Pythagorean_triples.png Screenshot from Atari 8-bit computer] |
|||
<pre> |
|||
There are 17 pythagorean triples with a perimeter less than 100: |
|||
(3 4 5) (5 12 13) (6 8 10) (7 24 25) (8 15 17) (9 12 15) (9 40 41) (10 24 26) (12 16 20) |
|||
(12 35 37) (15 20 25) (15 36 39) (16 30 34) (18 24 30) (20 21 29) (21 28 35) (24 32 40) |
|||
7 of them are primitive: |
|||
(3 4 5) (5 12 13) (7 24 25) (8 15 17) (9 40 41) (12 35 37) (20 21 29) |
|||
</pre> |
</pre> |
||