Weitere Varianten.

This commit is contained in:
hjp 2015-08-25 15:40:53 +00:00
parent 243c54a8ef
commit 6a45dceeaf
5 changed files with 74 additions and 5 deletions

View File

@ -1,6 +1,7 @@
CFLAGS = -Wall -O9
all: collatz collatz2
all: collatz collatz2 collatz3 modf
collatz:
collatz2:
collatz2: collatz2.o
$(CC) -o $@ $^ -lm

View File

@ -1,7 +1,8 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#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) {

40
collatz/collatz3.c Normal file
View File

@ -0,0 +1,40 @@
#include <stdio.h>
#include <stdlib.h>
#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;
}

15
collatz/modf.c Normal file
View File

@ -0,0 +1,15 @@
#include <stdio.h>
#include <math.h>
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;
}

4
collatz/ulam.txt Normal file
View File

@ -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.