#include "cpp_headers/fcpp.hh" // prueft ob Zahl gerade oder nicht int iseven(int n) { return n % 2 == 0; } // berechnet Quadrat einer Zahl int square(int x) { return x * x; } // berechnet x^exp schnell int potenz(int x, int exp) { return cond(exp == 1, // falls exp == 1 x, // x^1 = x cond(iseven(exp), square(potenz(x, exp / 2)), // wenn gerade x * potenz(x, exp-1))); // wenn ungerade } // summiert alle echten Teiler einer zahl auf int summiereTeiler(int summe, int index, int zahl) { // der index stellt den aktuellen zu pruefenden Teiler dar // falls dieser groeßer ist als die Haelfte der Zahl, kann es keine // echten Teiler mehr geben, d.h. es wird die aktuelle Summe zurueckgegeben return cond(index > zahl / 2, summe, // falls index die zahl teilt, wird die Summe um index erhöht // danach wird der nächste moegliche Teiler geprueft summiereTeiler(cond(zahl % index == 0, summe + index, summe), index + 1, zahl)); } // berechnet ob eine Zahl vollkommen ist bool vollkommen(int zahl) { // summiere alle Teiler und pruefe ob die Zahl gleich dieses Summe // es wird mit der Startsumme 0 und dem ersten Teiler 1 gestartet return summiereTeiler(0, 1, zahl) == zahl; } int main() { return print(potenz(2, 10), cond(vollkommen(8128), "8128 ist vollkommen", "8128 ist nicht vollkommen"), 0); }