Für Vorlesungen, bitte die Webseite verwenden. https://flavigny.de/lecture
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

50 рядки
1.6KB

  1. #include "cpp_headers/fcpp.hh"
  2. // prueft ob Zahl gerade oder nicht
  3. int iseven(int n) {
  4. return n % 2 == 0;
  5. }
  6. // berechnet Quadrat einer Zahl
  7. int square(int x) {
  8. return x * x;
  9. }
  10. // berechnet x^exp schnell
  11. int potenz(int x, int exp) {
  12. return cond(exp == 1, // falls exp == 1
  13. x, // x^1 = x
  14. cond(iseven(exp),
  15. square(potenz(x, exp / 2)), // wenn gerade
  16. x * potenz(x, exp-1))); // wenn ungerade
  17. }
  18. // summiert alle echten Teiler einer zahl auf
  19. int summiereTeiler(int summe, int index, int zahl) {
  20. // der index stellt den aktuellen zu pruefenden Teiler dar
  21. // falls dieser groeßer ist als die Haelfte der Zahl, kann es keine
  22. // echten Teiler mehr geben, d.h. es wird die aktuelle Summe zurueckgegeben
  23. return cond(index > zahl / 2,
  24. summe,
  25. // falls index die zahl teilt, wird die Summe um index erhöht
  26. // danach wird der nächste moegliche Teiler geprueft
  27. summiereTeiler(cond(zahl % index == 0, summe + index, summe),
  28. index + 1,
  29. zahl));
  30. }
  31. // berechnet ob eine Zahl vollkommen ist
  32. bool vollkommen(int zahl) {
  33. // summiere alle Teiler und pruefe ob die Zahl gleich dieses Summe
  34. // es wird mit der Startsumme 0 und dem ersten Teiler 1 gestartet
  35. return summiereTeiler(0, 1, zahl) == zahl;
  36. }
  37. int main() {
  38. return print(potenz(2, 10),
  39. cond(vollkommen(8128),
  40. "8128 ist vollkommen",
  41. "8128 ist nicht vollkommen"),
  42. 0);
  43. }