diff --git a/collatz/GNUmakefile b/collatz/GNUmakefile index 42d4c61..8eb0511 100644 --- a/collatz/GNUmakefile +++ b/collatz/GNUmakefile @@ -1,6 +1,7 @@ CFLAGS = -Wall -O9 -all: collatz collatz2 +all: collatz collatz2 collatz3 modf collatz: -collatz2: +collatz2: collatz2.o + $(CC) -o $@ $^ -lm diff --git a/collatz/collatz2.c b/collatz/collatz2.c index 0491c61..19581c1 100644 --- a/collatz/collatz2.c +++ b/collatz/collatz2.c @@ -1,7 +1,8 @@ #include #include +#include -#define USE_INT 1 +#define USE_DOUBLE 1 #ifdef USE_INT typedef int T; @@ -11,10 +12,18 @@ typedef long T; #define FT "%ld" #define even(x) ((x) % 2 == 0) +#elif USE_LONG_LONG + typedef long long T; + #define FT "%lld" + #define even(x) ((x) % 2 == 0) #elif USE_DOUBLE typedef double T; - #define FT "%20g" - #define even(x) (floor((x) / 2) == ((x) / 2)) + #define FT "%20.1f" + #ifdef USE_FLOOR + #define even(x) (floor((x) / 2) == ((x) / 2)) + #else + #define even(x) (fmod((x), 2.0) == 0.0) + #endif #endif long collatz(T j) { diff --git a/collatz/collatz3.c b/collatz/collatz3.c new file mode 100644 index 0000000..5520408 --- /dev/null +++ b/collatz/collatz3.c @@ -0,0 +1,40 @@ +#include +#include + +#define USE_INT 1 + +#ifdef USE_INT + typedef int T; + #define FT "%d" + #define odd(x) ((x) % 2 == 1) +#elif USE_LONG + typedef long T; + #define FT "%ld" + #define odd(x) ((x) % 2 == 1) +#elif USE_DOUBLE + typedef double T; + #define FT "%20g" + #define odd(x) (floor((x) / 2) != ((x) / 2)) +#endif + +long collatz(T j) { + + long c = 0; + while (j != 1) { + printf("%ld: " FT "\n", c, j); + if (odd(j)) { + j = j * 3 + 1; + } else { + j = j / 2; + } + c++; + } + return c; +} + +int main(void) { + T i = 113383; + long c = collatz(i); + printf("%ld\n", c); + return 0; +} diff --git a/collatz/modf.c b/collatz/modf.c new file mode 100644 index 0000000..eafe2c3 --- /dev/null +++ b/collatz/modf.c @@ -0,0 +1,15 @@ +#include +#include + +int main(void) { + double x = 3.14; + double y, z; + + y = modf(x, &z); + printf("%g, %g\n", y, z); + + y = modf(x, NULL); + printf("%g, %g\n", y, z); + + return 0; +} diff --git a/collatz/ulam.txt b/collatz/ulam.txt new file mode 100644 index 0000000..cfda02f --- /dev/null +++ b/collatz/ulam.txt @@ -0,0 +1,4 @@ +Ich kannte dieses Problem ursprünglich als "Ulams Vermutung". + +Laut http://de.wikipedia.org/wiki/Collatz-Problem stammt es aber +ursprünglich von Lothar Collatz.