50 lines
1.6 KiB
C++
50 lines
1.6 KiB
C++
#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);
|
|
}
|