Creative Commons License Foxbond's Repo

/** (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