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