Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- string dodaj(string a, string b)
- {
- // wyznaczamy pozycję ostatniej cyfry w obu łańcuchach
- int pa = a.length() - 1;
- int pb = b.length() - 1;
- // zerujemy łańcuch wynikowy
- string wynik = "";
- // na początku przeniesienie wynosi 0
- int p = 0;
- // w pętli dodajemy kolejne cyfry a i b
- while(pa >= 0 || pb >= 0)
- {
- // wyliczamy wartości cyfr w łańcuchach a i b
- int ca, cb, w;
- if(pa >= 0) ca = a[pa] - 48; else ca = 0;
- if(pb >= 0) cb = b[pb] - 48; else cb = 0;
- // obliczamy sumę cyfr z a i b, uwzględniając przeniesienie
- w = ca + cb + p;
- // do łańcucha wynikowego wstawiamy ostatnią cyfrę w
- wynik = "0" + wynik;
- wynik[0] = 48 + w % 10;
- // obliczamy przeniesienie do następnej kolumny
- p = w / 10;
- // modyfikujemy indeksy kolumn w łańcuchu a i b
- pa--; pb--;
- }
- // jeśli przeniesienie wynosi 1, dopisujemy cyfrę 1 do wyniku
- if(p) wynik = "1" + wynik;
- return wynik;
- }
- // Funkcja mnoży małą liczbę 32 bitową przez dużą
- //-----------------------------------------------
- string mnoz(unsigned a, string b)
- {
- string wynik = "0";
- unsigned maska;
- for(maska = 1; maska; maska <<= 1)
- {
- if(a & maska) wynik = dodaj(wynik, b);
- b = dodaj(b, b);
- }
- return wynik;
- }
- int main()
- {
- int i,n;
- string silnia = "1";
- cin >> n;
- for(i = 1; i <= n; i++) silnia = mnoz(i,silnia);
- cout << n << "! = " << silnia << endl << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement