Advertisement
ridjis

kolokrek

Dec 26th, 2013
373
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. MODULE kolok;
  2. FROM InOut IMPORT WriteString,WriteLn,ReadInt,WriteInt;
  3. CONST maxn=30;
  4.       maxr=20;
  5.       sk={0,1,4,9};
  6. TYPE niz= ARRAY [0..maxr] OF INTEGER;
  7. (*A*)
  8. PROCEDURE grec(n,r:INTEGER):INTEGER; FORWARD;
  9. PROCEDURE frec(n,r:INTEGER):INTEGER;
  10. BEGIN
  11.   IF n<r THEN
  12.     RETURN n
  13.   ELSE
  14.     IF n MOD 10 IN sk THEN
  15.       RETURN frec(n-r,r)-frec(n-r+1,r)+grec(n-r+2,r)-grec(n-r+1,r)
  16.     ELSE
  17.       RETURN -frec(n-1,r)+grec(n-r,r)-frec(n-r+2,r)-grec(n-1,r)
  18.     END;
  19.   END;
  20. END frec;
  21. PROCEDURE grec(n,r:INTEGER):INTEGER;
  22. BEGIN
  23.   IF n<r THEN
  24.     RETURN -n
  25.   ELSE
  26.     IF n DIV 2 = 0 THEN
  27.       RETURN 3*frec(n-2,r)+2*(grec(n-r+2,r)-frec(n-r+3,r))-grec(n-r,r);
  28.     ELSE
  29.       RETURN -grec(n-r+1,r)-frec(n-2,r)
  30.     END;
  31.   END;
  32. END grec;
  33. (*B*)
  34. PROCEDURE frec2(n,r:INTEGER):INTEGER;
  35.   PROCEDURE FG(f,g:niz; i:INTEGER):INTEGER;
  36.   VAR j:INTEGER;
  37.   BEGIN
  38.     IF i>n THEN
  39.       RETURN f[r]
  40.     ELSE
  41.       IF i MOD 10 IN sk THEN
  42.         f[r]:=f[0]-f[1]+g[2]-g[1];
  43.       ELSE
  44.         f[r]:=-f[r-1]+g[0]-f[2]-g[r-1];
  45.       END;
  46.       IF i DIV 2 = 0 THEN
  47.         g[r]:=3*f[r-2]+2*(g[2]-f[3])-g[0];
  48.       ELSE
  49.         g[r]:=-g[1]-f[r-2];
  50.       END;
  51.       FOR j:=0 TO r-1 DO
  52.         f[j]:=f[j+1];
  53.     g[j]:=g[j+1];
  54.       END;
  55.       RETURN FG(f,g,i+1);
  56.     END;
  57.   END FG;
  58. VAR f,g:niz;
  59.     j:INTEGER;
  60. BEGIN
  61.   IF n<r THEN
  62.     RETURN n
  63.   ELSE
  64.     FOR j:=0 TO r-1 DO
  65.       f[j]:=j;
  66.       g[j]:=-j;
  67.     END;
  68.     RETURN FG(f,g,r);
  69.   END;
  70. END frec2;
  71. (*C*)
  72. PROCEDURE fiter(n,r:INTEGER):INTEGER;
  73. VAR f,g:niz;
  74.     i,j:INTEGER;
  75. BEGIN
  76.   FOR i:=0 TO r-1 DO
  77.     f[i]:=i;
  78.     g[i]:=-i;
  79.   END;
  80.   IF n<r THEN
  81.     RETURN f[n]
  82.   ELSE
  83.     FOR i:=r TO n DO
  84.       IF i MOD 10 IN sk THEN
  85.         f[r]:=f[0]-f[1]+g[2]-g[1];
  86.       ELSE
  87.         f[r]:=-f[r-1]+g[0]-f[2]-g[r-1];
  88.       END;
  89.       IF i DIV 2 = 0 THEN
  90.         g[r]:=3*f[r-2]+2*(g[2]-f[3])-g[0];
  91.       ELSE
  92.         g[r]:=-g[1]-f[r-2];
  93.       END;
  94.       FOR j:=0 TO r-1 DO
  95.         f[j]:=f[j+1];
  96.     g[j]:=g[j+1];
  97.       END;
  98.     END;
  99.   END;
  100.   RETURN f[r];
  101. END fiter;
  102. (*glavni program*)
  103. VAR n,r:INTEGER;
  104. BEGIN
  105.   REPEAT
  106.     WriteString('Unesite n (0<=n<=');
  107.     WriteInt(maxn,1);
  108.     WriteString('): ');
  109.     ReadInt(n);
  110.   UNTIL (0<=n) AND (n<=maxn);
  111.   REPEAT
  112.     WriteString('Unesite r (6<=r<=');
  113.     WriteInt(maxr,1);
  114.     WriteString('): ');
  115.     ReadInt(r);
  116.   UNTIL (6<=r) AND (r<=maxr);
  117.   WriteString('Frec1(n,r)=');
  118.   WriteInt(frec(n,r),5);
  119.   WriteLn;
  120.   WriteString('Frec2(n,r)=');
  121.   WriteInt(frec2(n,r),5);
  122.   WriteLn;
  123.   WriteString('Fiter(n,r)=');
  124.   WriteInt(fiter(n,r),5);
  125.   WriteLn;
  126. END kolok.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement