Nie trzeba zmieniać języka!
Wystarczy liczby wpisać do tablic. A nauczyciel tak się zna na tym co robi jak ja na balecie.
Właśnie pisze program, który robi coś podobnego. np. liczy 1872387678678653785 * 2323233. A i silnie z 1000 (1000!) nim policzysz. Na razie wyskakuje błąd, ale jak tylko go zniweluję, wstawię prawidłowy kod. Na razie masz to:
// program mnozacy dwie duze liczby i zwracajacy wartosc silni z pobranej liczby
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 1000 //rozmiar tablic, wystarczajacy na potrzeby tworcy
short pobierz(short int [], int); //pobiera liczbe w postaci tablicy cyfr i zwraca ilosc pobranych cyfr
void zeruj(short int [], int); //zeruje kolejne elementy tablicy
void mnoz(short int [], short int [], short int [], int, short int, short int); //mnozy dwie liczby w postaci tablicy cyfr
void liczsilnie(short int [], short int, int); //liczy silnie wskazanej liczby, pobiera tablice, w ktorej zapisuje wynik i jej rozmiar
int main(void)
{
short int liczbap[SIZE], liczbad[SIZE], wynik[SIZE]; //liczbap- pierwsza liczba, liczbad- druga liczba
short int flaga, IloscZP, IloscZD; //ZP- Znakow Pierwszej liczby, ZD- Znakow Drugiej liczby
short int n; //zmienna pomocnicza
short int silnia; //liczba, ktorej silnia bedzie liczona
char wybor; //zmienna okreslajaca wybor dzialan uzytkownika
printf("Jesli chcesz mnozyc liczby wpisz \"M\".\nJesli chcesz liczyc silnie wpisz \"S\".\nAby zakonczyc wpisz \"Z\"\n");
wybor = getchar();
getchar();
if (wybor == 'M' || wybor == 'm') //liczenie iloczynu
{
zeruj(liczbap, SIZE);
zeruj(liczbad, SIZE);
zeruj(wynik, SIZE);
printf("Podaj pierwsza liczbe:\n");
IloscZP = pobierz(liczbap, SIZE);
printf("Podaj druga liczbe:\n");
IloscZD = pobierz(liczbad, SIZE);
mnoz(liczbap, liczbad, wynik, SIZE, IloscZP, IloscZD);
printf("Wynik to:\n");
for (n = 0; n < SIZE; n++) //petla wypisujaca wynik mnozenia dwoch liczb w postaci tablic cyfr
printf("%1hd", *(wynik + n));
}
else if (wybor == 'S' || wybor == 's') //liczenie silni
{
printf("Podaj liczbe, ktorej silnie chcesz obliczyc\n");
scanf("%hd", &silnia);
liczsilnie(wynik, silnia, SIZE);
for (n = 0; n < SIZE; n++);
printf("%1hd", *(wynik + n));
}
else if (wybor == 'Z' || wybor == 'z') //konczenie programu
return 0;
else //blad polecenia
printf("nie ma takiego polecenia. Program zostanie zamkniety\n");
putchar('\n');
system("PAUSE");
return 0;
}
void zeruj(short int tab[], int rozmiar)
{
short int licznik; //zmienna pomocnicza
for (licznik = 0; licznik < rozmiar; licznik++)
*(tab + licznik) = 0;
}
short pobierz(short int tab[], int rozmiar)
{
short int flaga, n; //zmienne pomocnicze
short int robocza[rozmiar]; //tablica robocza, wykorzystana do pracy na tablicy glownej
char znak; //aktualnie pobierany, z wejscia, znak
zeruj(robocza, rozmiar);
for (n = 0; isdigit(znak = getchar()); n++) //pobiera kolejne cyfry do tablic docelwej i roboczej
*(robocza + n) = *(tab + n) = (short) znak - (short) '0';
zeruj(tab, rozmiar); //zeruje tablice glowna
for (flaga = 0; flaga <= n; flaga++) //zmienia kolejnosc wystepowania cyfr w tablicy glownej-
*(tab + (rozmiar - n + flaga)) = *(robocza + flaga); //- ostatnia cyfra jest na ostatnim miejscu w tablicy
return n;
}
void mnoz(short int pierwsza[], short int druga[], short int iloczyn[], int rozmiar, short IloscZP, short IloscZD)
{
short int n, i, k, flaga, wynik, przepelnienie;
short int robocza[rozmiar];
zeruj(iloczyn, rozmiar);
for (i = rozmiar - 1, k = 0; i >= rozmiar - IloscZD; i--, k++) //oblicza iloczyn
{
zeruj(robocza, rozmiar);
for (n = rozmiar - 1, przepelnienie = 0; n >= 0; n--) //mnozy i-ty element pierwszej tablicy przez -
{ //n-ty element drugiej tablicy, wyniki zapisuje -
wynik = *(pierwsza + i) * *(druga + n) + przepelnienie; //w odpowiednich elementach tablicy roboczej
*(robocza + (n - k)) = wynik % 10; //odejmowanie zmiennej k, odpowiada przesunieciu wyniku o k miejsc w lewo
przepelnienie = wynik / 10;
}
if (przepelnienie != 0) //sprawdza czy nienastapilo przepelnienie
{
printf("Nastapil blad spowodowany zbyt duzym rozmiarem liczby. Program nie dziala prawidlowo\n");
break;
}
for (n = rozmiar - 1, przepelnienie = 0; n >= 0; n--) //sumuje odpowiednie elementy tablic roboczych do -
{ //odpowiadajacych im elementow tablicy iloczynu
*(iloczyn + n) = ( *(iloczyn + n) + *(robocza + n) + przepelnienie) % 10;
przepelnienie = ( *(iloczyn + n) + *(robocza + n) ) / 10;
}
if (przepelnienie != 0) //sprawdza czy nienastapilo przepelnienie
{
printf("Nastapil blad spowodowany zbyt duzym rozmiarem liczby. Program nie dziala prawidlowo\n");
break;
}
}
}
void liczsilnie(short int wynik[], short int silnia, int rozmiar)
{
short int k, n,a, flaga; //zmienna pomocnicza
short int ilosc; //ilosc cyfr pobranej liczby
short int TabP[rozmiar], TabD[rozmiar]; //tablice pomocnicze
zeruj(wynik, SIZE);
zeruj(TabP, rozmiar);
zeruj(TabD, rozmiar);
for (ilosc = 1, k = 10; k <= silnia; ilosc++) //liczy ilosc cyfr pobranej liczby
k *= 10;
for (a = silnia, n = rozmiar - 1; n >= rozmiar - ilosc; n--) //przypisuje pobrana liczbe tablicy
{
*(TabP + n) = a % 10;
a /= 10;
}
silnia--; //obniza wartosc liczby o 1 aby w nastepnej petli nie mnozyc dwoch tych samych liczb
for (1 ; silnia > 0; silnia--) //liczy silnie korzystajac z wczesniejszej petli
{
zeruj(TabD, rozmiar);
for (k = silnia, n = rozmiar - 1; n > 0; n--) //przypisuje aktualna liczbe tablicy
{
*(TabD + n) = k % 10;
k /= 10;
}
mnoz(TabP, TabD, wynik, rozmiar, ilosc + 1, ilosc + 1); //mnozy aktualna liczbe przez wynik wczesniejszych iloczynow
for (flaga = 0; flaga < rozmiar; flaga++) // wynik aktualnego iloczynu
*(TabP + flaga) = *(wynik + flaga);
for (n = 0; n < SIZE; n++) //petla wypisujaca wynik mnozenia dwoch liczb w postaci tablic cyfr
printf("%1hd", *(wynik + n));
putchar('\n');
}
}