Creative Commons License Foxbond's Repo

/**(c) 2016 Michał (Foxbond) Chraniuk */
#include <iostream>
#include <string>
#include <stdio.h>
#include <time.h>

using namespace std;

clock_t start;

void cls() {
	system("cls");
}

void showProgress (int curr, int max) {
	cls();
	printf("[");
	int p = curr*10/max;
	for (int i = 0;i < 10;i++) {
		if (p >= i) {
			printf("*");
		}
		else {
			printf("-");
		}
	}
	printf("]\n");
}

void showProgressAdv(int curr, int max) {
	cls();
	printf("[");
	int p = curr * 20 / max;
	for (int i = 0;i < 20;i++) {
		if (p >= i) {
			printf("*");
		}
		else {
			printf("-");
		}
	}
	printf("] %.2f%% (%d!/%d!) Czas: %dms\n", ((float)curr*100/(float)max), curr, max, (int)(clock()-start));
}

string rewrite(string text) {
	string ret;

	for (int i = text.length() - 1;i >= 0;i--) {
		ret += text[i];
	}

	return ret;
}

string cut(string text) {
	int pos = text.length();
	for (int i = text.length() - 1;i >= 0;i--) {
		if (text[i] != '0') {
			pos = i + 1; 
			break;
		}
	}
	return text.substr(0, pos);
}

int char2int(char znak) {
	return (int)znak - 48;
}

char int2char(int l) {
	return (char)(l + 48);
}

int sumChar(char l1, char l2) {
	return char2int(l1) + char2int(l2);
}

int sumChar(char l1, char l2, char l3) {
	return char2int(l1) + char2int(l2) + char2int(l3);
}

string pAdd(string l1, string l2) {
	string wynik;

	int diff = l1.length() - l2.length();
	if (diff > 0) {
		for (int i = 0;i <= diff;i++) {
			l2 += '0';
		}
		l1 += '0';
		diff = l1.length() + 1;
	}
	else {
		for (int i = 0;i <= diff;i++) {
			l1 += '0';
		}
		l2 += '0';
		diff = l2.length() + 1;
	}

	for (int i = 0;i < diff;i++) {
		wynik += '0';
	}

	for (int i = 0;i < diff-1;i++) {
		int temp = sumChar(l1[i], l2[i], wynik[i]);
		if (temp > 9) {
			wynik[i] = int2char(temp%10);
			wynik[i+1] = int2char(temp/10);
		}
		else {
			wynik[i] = int2char(temp);
		}
	}

	return wynik;
}

string pMultiply(string l1, int l2) {
	string wynik;

	for (int i = 0;i <= l1.length();i++) {
		wynik += '0';
	}

	for (int i = 0;i < l1.length();i++) {
		int temp = (char2int(l1[i])*l2)+char2int(wynik[i]);
		if (temp > 9) {
			wynik[i] = int2char(temp % 10);
			wynik[i + 1] = int2char(temp / 10);
		}
		else {
			wynik[i] = int2char(temp);
		}
	}

	return wynik;
}

string pMultiply(string l2, string l1) {
	string wynik;

	for (int i = 0;i < l1.length()+ l2.length();i++) {
		wynik += '0';
	}

	for (int i = 0;i < l2.length();i++) {
		if (l2[i] != '0') {
			string temp = pMultiply(l1, char2int(l2[i]));
			for (int j = 0;j < i;j++) {
				temp.insert(0, "0");
			}
			
			wynik = pAdd(wynik, temp);
			wynik = wynik.substr(0, (l1.length() + l2.length()));
		}
	}

	return wynik;
}

string silnia(int l) {
	if (l < 0) {
		return "(Liczba musi byc wieksza od 0)";
	}
	else if (l == 0) {
		return "1";
	}
	else if (l < 8) {
		int wynik=1;
		for (int i = l;l > 0;l--) {
			wynik = wynik*l;
		}
		return to_string(wynik);
	}
	else {
		string wynik = "1";
		start = clock();

		for (int i = 1;i <= l;i++) {
			wynik = pMultiply(rewrite(to_string(i)), wynik);
			showProgressAdv(i, l);
		}

		wynik = rewrite(wynik);

		int pos = 0;
		for (int i = 0;i < wynik.length();i++) {
			if (wynik[i] != '0') {
				pos = i;
				break;
			}
		}
		return wynik.substr(pos);
	}

}

int main() {
	int liczba;
	char znak;
	do {
		cls();
		cout << "Podaj liczbe: \n";
		cin >> liczba;

		cout << liczba << "! = " << silnia(liczba) << "\nJeszcze raz? (y/n) ";
		cin >> znak;
	} while (znak == 'y' || znak == 'Y');

	return 0;
}

> Back