Silnia dla dużych liczb + stringi

0

Mam taki oto mały wielki problemik, muszę napisać program (w C++) obliczający silnię dla liczb powyżej 12.

Napisanie programu na obliczanie silni to w zasadzie banał, ale przy liczbach powyżej 20 nie starcza już nawet unsigned long long int (co akurat nie jest specjalnie zaskakujące ;)).

Żeby wszystko było jasne, muszę zastosować stosy w operacjach dodawania/mnożenia itp. dużych liczb zapisanych jako string (taki jest wymóg zadania), tylko kompletnie nie wiem jak się do tego zabrać.
Może ktoś pisał kiedyś coś takiego albo wie jak to stworzyć?

Mój programik dla obliczania silni dla małych liczb:

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	unsigned long long int silnia;
	int liczba;
	char znak;

	while(true)
	{
		silnia = 1;

		cout << "Podaj liczbe, z ktorej chcesz obliczyc silnie > ";
		cin >> liczba;

		if(liczba > 12)
		{
			for(int i=1; i<=liczba; i++)
			{
			silnia = silnia * i;
		}
			cout << "Silnia z liczby " << liczba << " wynosi: " << silnia << endl;
		}
		else
		{
			cout << "Liczba musi byc wieksza od 12" << endl;
		}
		
		cout << "Chcesz obliczyc kolejna silnie? (t/n) > ";
		cin >> znak;
		
		system("cls");

		while(znak == 'n' || znak == 'N')
		{
			system("pause");
			return 0;
		}

	}

	system("pause");
	return 0;
}
0

Poszukaj sobie bibliotek , bigint , bignum etc ;0

0

To nie ma być zrobione na tych bibliotekach, w treści napisałem o co chodzi!

0

Ale chyba umiesz przeanalizowac kod biblioteki ?:)
A moze wymyslac kolo na nowo ?

0

Najpierw wypada zaimplementować stos przechowujący cyfry. Niech to będą cyfry dziesiętne. Nie jest to wydajne rozwiązanie, ale nie będzie potrzebna konwersja między binarnym systemem liczbowym. Do pamiętania cyfr pomocna będzie klasa vector. Przykładową klasę liczby możesz zacząć tak:

class DuzaLiczba: protected std::vector<unsigned char="char">
{
};

Wewnątrz klasy zdefiniuj różne konstruktory, operatory dodawania, mnożenia itp.

A same operacje arytmetyczne zrealizujesz tak, jakbyś w słupku na kartce liczył.
Przykładowo dla dodawania:

  1. dopóki są cyfry w składnikach
    {
    1a. weź kolejne cyfry składników i dodaj je do przeniesienia (jeśli cyfry się skończyły w jednym ze składników to weź 0)
    1b. resztę z dzielenia powyższej sumy przez 10 wrzuć na stos wyniku, a wynik dzielenia zapisz w przeniesieniu
    }
  2. wrzuć na stos wyniku przeniesienie

Jak będziesz miał jakiś konkretny problem to dostaniesz konkretną odpowiedź.

0

Nie idzie mi to za bardzo, a nie mam teraz czasu żeby się w to zagłębiać jakoś specjalnie, więc mimo tego, że pewnie wyjdę na trolla to spytam się: ma może ktoś u siebie gdzieś napisaną klasę, która przechowuje dużą liczbę w tablicy char-ów i pozwala mnożyć i dodawać takie liczby?

1 użytkowników online, w tym zalogowanych: 0, gości: 1