A large commit.
[pdp8.git] / sw / src / pascal / PERMUT.V4
diff --git a/sw/src/pascal/PERMUT.V4 b/sw/src/pascal/PERMUT.V4
new file mode 100644 (file)
index 0000000..622b442
--- /dev/null
@@ -0,0 +1,56 @@
+PROGRAM PERMUTATIONEN(INPUT,OUTPUT);
+
+    VAR I,N,NFAKTORIELLE: INTEGER;
+        C: ARRAY[1..10] OF INTEGER;
+
+
+    FUNCTION FAK(N: INTEGER): INTEGER;
+        BEGIN
+            IF N=1 THEN FAK := 1
+                   ELSE FAK := N*FAK(N-1)
+        END (* FAK *);
+
+
+
+    PROCEDURE WRITEPERMUTATION;
+      VAR I: INTEGER;
+        BEGIN
+            WRITE(" ":10);
+            FOR I := 1 TO N  DO WRITE( C[I] :3);
+            WRITELN
+        END (* WRITEPERMUTATION *);
+
+
+
+    PROCEDURE NEXTPERMUTATION;
+      VAR I,PRODUKT: INTEGER;
+        BEGIN
+            REPEAT
+                C[N] := C[N] + N-1;
+                PRODUKT := 1;
+                FOR I := N DOWNTO 1 DO
+                    BEGIN
+                        IF C[I]>N THEN  BEGIN
+                                            C[ I ] := C[ I ] - N;
+                                            C[I-1] := C[I-1] + 1
+                                        END;
+                        PRODUKT := PRODUKT*C[I]
+                    END
+            UNTIL PRODUKT=NFAKTORIELLE
+        END (* NEXTPERMUTATION *);
+
+
+
+BEGIN
+    WRITE("P E R M U T A T I O N E N   DER ORDNUNG");
+    READ(N);
+    WRITELN;
+    NFAKTORIELLE := FAK(N);
+    FOR I := 1 TO N  DO C[I] := I;
+    WRITEPERMUTATION;
+    FOR I := 2 TO NFAKTORIELLE  DO
+        BEGIN
+            NEXTPERMUTATION;
+            WRITEPERMUTATION
+        END
+END.