/** (c) 2015 Michał (Foxbond) Chraniuk */
/*
Za pomocą programu sprawdziłem pierwsze 154658 liczb, dla wszystkich algorytm spełniał swoją funkcję.
1: Liczba elementow ciagu: 0, Najwieksza wartosc: 0
2: Liczba elementow ciagu: 1, Najwieksza wartosc: 1
3: Liczba elementow ciagu: 7, Najwieksza wartosc: 16
4: Liczba elementow ciagu: 2, Najwieksza wartosc: 2
5: Liczba elementow ciagu: 5, Najwieksza wartosc: 16
6: Liczba elementow ciagu: 8, Najwieksza wartosc: 16
7: Liczba elementow ciagu: 16, Najwieksza wartosc: 52
8: Liczba elementow ciagu: 3, Najwieksza wartosc: 4
9: Liczba elementow ciagu: 19, Najwieksza wartosc: 52
10: Liczba elementow ciagu: 6, Najwieksza wartosc: 16
....
154653: Liczba elementow ciagu: 139, Najwieksza wartosc: 463960
154654: Liczba elementow ciagu: 139, Najwieksza wartosc: 782944
154655: Liczba elementow ciagu: 170, Najwieksza wartosc: 2972752
154656: Liczba elementow ciagu: 77, Najwieksza wartosc: 77328
154657: Liczba elementow ciagu: 170, Najwieksza wartosc: 463972
154658: Liczba elementow ciagu: 77, Najwieksza wartosc: 231988
Problem jaki rozwiązuje program jest znany również jako problem Collatza. Są dwie możliwości zaprzeczenia hipotezie:
*dla jakiejś liczby początkowej otrzymany ciąg wpada w cykl inny niż (..., 4, 2, 1, ...);
*dla jakiejś liczby początkowej otrzymany ciąg jest rozbieżny do nieskończoności.
Wykazano, że algorytm działa poprawnie dla liczb mniejszych od 5.764×10^18 https://goo.gl/3n8cVG
*/
#include <stdio.h>
int deepLimit = 1000;
int max = 0;
int elem = 0;
int f(int n) {
if (elem > deepLimit) {
return 0;
}
int temp;
if (n == 1) {
return 0;
}
if (n % 2 == 0) {
temp = n / 2;
}
else {
temp = 3 * n + 1;
}
++elem;
if (temp > max) max = temp;
f(temp);
return 0;
}
int main() {
FILE *fp;
if ((fp = fopen("data.txt", "w")) == NULL) {
printf("Nie moge otworzyc pliku test.txt do zapisu!\n");
exit(1);
}
long long int len;
for (int i = 1; 1; i++) {
f(i);
fprintf(fp, "%6d: Liczba elementow ciagu: %6d, Najwieksza wartosc: %d\n", i, elem, max);
elem = max = 0;
fgetpos(fp, &len);
if ( 10 * 1024 * 1024 < len) { break; }
}
fclose(fp);
return 0;
}
> Back