Witam,
Potrzebuję jakiejkolwiek pomocy z dokończeniem programu obliczającego PI z dokładnością do 200 miejsc po przecinku. Poniżej podaje kod, który sam spłodziłem. Zawiesiłem się na dzieleniu pisemnym - nie wiem jak je ładnie zapętlić żeby się dalej liczyło. :( Kontakt ze mną dywanik[monkey]gmail.com. Będę wdzięczny za każdą pomoc! Pozdrawiam.
#include<stdio.h>
int main()
{
//TABLICE DO MNOZENIA PISEMNEGO
int MNOZONA[100]; //WIADOMO
int C[100],D[100],E[100],F[100],G[100]; //TE TABLICE SUMUJEMY
int WYNIK[100],DODANIA[100]; //WYNIK-WIADOMO, DODANIA-TO CO DODAJEMY JAK WYNIK >=10
//TABLICE DO MNOZENIA PISEMNEGO KONIEC
int i,j,k,l, m, r, a, b, n, z, wynik, h, o;
int PI[100]; //CHYBA WIADOMO? :D
//TABLICE DO DODAWANIA PISEMNEGO
int CZYNNIK[100], DOD2[100], DOD1[100], WYNDOD[100]; //------------------------------//
//TABLICE DO DODAWANIA PISEMNEGO KONIEC // //
// WYNIK jest normalnie //
//TABLICE DO ODEJMOWANIA PISEMNEGO // zapisywany czyli od [0] //
int WYNMIN[100], WYNMIN1[100]; // zatem ignor@reszta 0!!! //
//TABLICE DO ODEJMOWANIA PISEMNEGO KONIEC // ktore beda wyplute //
// //
//TABLICE DO DZIELENIA PISEMNEGO //------------------------------//
int X[100];// DZIELNIK
int Y[100];// DZIELNA
int Z[100];// WYNIK
int Q[100];// MANIPULATORY DO OTRZYMANIA WYNIKU o_O
int WX[100];// DZIELNIK
int WY[100];// DZIELNA
int WZ[100];// WYNIK
int WQ[100];// MANIPULATORY DO OTRZYMANIA WYNIKU o_O
int Wz, Wm, Wj;
//TABLICE DO DZIELENIA PISEMNEGO KONIEC
int Y1[100];
//ZEROWANIE MACIERZY
for (r=0; r<=101; r++)
{
MNOZONA[r]=0, C[r]=0, D[r]=0, E[r]=0, F[r]=0, G[r]=0, WYNIK[r]=0, DODANIA[r]=0; //MNOZENIE
X[r]=0; Y[r]=0; Z[r]=0; Q[r]=0; //WEKTORY DO DZIELENIA
WYNMIN1[r]=0;WYNMIN[r]=0;
WX[r]=0; WY[r]=0; WZ[r]=0; WQ[r]=0;
WYNDOD[r]=0; DOD1[r]=0; DOD2[r]=0; CZYNNIK[r]=0;
PI[r]=0;
Y1[r]=0;
}
//ZEROWANIE MACIERZY KONIEC
wynik=0; //to nalezy do juz koncowego wyniku
// TUTAJ DE FACTO ZACZYNAMY DZIELIC.
// ILE RAZY X[i] MIESCI SIE W Y[i]?
//
//-----------------SPRAWDZAMY ILE RAZY COS SIE MIESCI W CZYMS :>----------------
//
// W NASTEPNYM KROKU WYNIK MNOZENIA PRZEZ z ODEJMIEMY OD CALOSCI
//
// zakladamy, ze mamy juz wypelnione macierze MNOZONA oraz MNOZNIK
i=0;
m=0;
X[0]=4; //liczbe 112 zapisujemy jako 000...000112// ZAPISUJEMY OD KONCA (OSTATNIA CYFRA NA [0])
X[1]=3; //z BEDZIE TA LICZBE MNOZYC!
j=1;
a=0; //w przykladzie mamy 10/34
Y[0]=0;
Y[1]=1; // TUTAJ JEST 10 I BEDZIE ZAMIAST 1 !!!
for (i=99; i>=0; i--){printf(" %d", X[i]);}
//w tym miejscu 10 rozmnazamy do duzych liczb w celu podzielenia np. 1/2828828282 trzeba zrobic na 1000000000/2828282822 etc. :>
b=0;
//jesli mianownik wiekszy od licznika do dodaj do mianownika zero dopoki nie bedzie wiekszy
o=1;
while (o==1){
for (i=99; i>=0; i--)
{
if (X[i] > Y[i]){h=1;o=1;break;} //--> przesun o jedna komorke w lewo :>
if (X[i] < Y[i]){o=0;break;} //-----------------------------//
} // UWAGA! ACHTUNG! DANGER! //
// Dodajac 0 dodaje nam o //
if (h==1) // jedno wiecej niz powinien. //
{ // Uwzglednimy to pozniej ale //
for (j=99; j>=0; j--) // nalezy o tym koniecznie //
{ // pamietac //
a=Y[j]; //-----------------------------//
Y[j+1]=a;
} // musze sie tego pozbyc bo przeciez cos sie moze miescic max 9 razy !!!
}
}
a=0;
//---------------------// // WARUNEK TEN istnieje gdyz Y[i] jest przesuniete o jedno 0 za daleko: Y1=100, a Y=1000.
for (j=99; j>=0; j--) //
{ //
a=Y[j]; // // UWAGA
Y1[j-1]=a; // // tutaj rozpoczynamy prace z Y1 !!!
} //
//---------------------//
printf("\nprzesuniecie\n");
for (i=99; i>=0; i--){printf(" %d", Y1[i]);}
// NIE MUSIMY ROBIC MNOZNIKA >=10 BO MNOZENIE POTRZEBNE TYLKO DO DZIELENIA,
// A W NIM NIE BEDZIE SIE COS MIESCIC WIECEJ NIZ 9 RAZY :] (DZIELNA vs DZIELNIK)
//
// TUTAJ SPRAWDZAM ILE RAZY COS SIE MIESCI W CZYMS
//
printf("\n\nMieszczenie sie.\n");
j=1;z=0;m=0;
while(z<10){ // miescic sie mozna max 9 razy por. dzielenie pisemne ;)
if(j==0){break;}
for (i=0; i<=99; i++)
{
Q[i]=X[i]*z+m;
m=0;
while (Q[i] >= 10 ) //CHCEMY WIEDZIEC ILE BEDZIE TRZEBA DODAC
{ //DO LICZBY JAKO 'DODANA'
Q[i] = Q[i] - 10;
m++;
}
}
for (i=99; i>=0; i--)
{ //TU TRZEBA DOROBIC z-- BO TO BEDZIE SZLO JAKO WYNIK
if (Q[i] > Y1[i]){j=0;z=z-2;break;} //MUSZA BYC OBA WARUNKI BO JAK ZMAZEMY DRUGI TO PIERWSZY BEDZIE ZAWSZE :|
if (Q[i] < Y1[i]){break;} // break nam niech zostanie bo wtedy bedzie konczyc petle jak stwierdzi ktore jest wieksze
} //MUSIMY TUTAJ DO GORY ZROBIC z=z-2; PONIEWAZ z JEST ZA KAZDYM RAZEM O 1 ZA DUZE. INNA METODA
z++; //MI NIE PRZYSZLA DO GLOWY ;P
}
//------SPRAWDZAMY ILE RAZY COS SIE MIESCI W CZYMS :>---KONIEC------------------
//
// TERAZ MNOZYMY z PRZEZ LICZBE PRZEZ KTORA DZIELIMY CZYLI PRZEZ X[i] i odejmujemy
//
printf("\n z=%d \n", z); //wypisanie wartosci MIESZCZENIA SIE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
for (i=0; i<99; i++)
{
C[i]=X[i]*z+m;
m=0;
while (C[i] >= 10 ) //CHCEMY WIEDZIEC ILE BEDZIE TRZEBA DODAC
{ //DO LICZBY JAKO 'DODANA'
C[i] = C[i] - 10;
m++;
}
}
printf("C[i]=z*X[i]\n"); // TYLKO WYPISANIE
for (n=99; n>=0; n--){printf(" %d", C[n]);}
// C[i] BEDZIEMY ODEJMOWAC OD Y[I]. WYNIK DA NAM "RESZTE"
// ZACZYNAMY ODEJMOWAC OBIE POWYZSZE RZECZY
printf("\n");printf("\n");
for (n=0; n<=99; n++)
{
if (C[n] > Y1[n])
{
Y1[n]=Y1[n]+10;
Y1[n+1]=Y1[n+1]-1;
}
WYNMIN[n]=Y1[n]-C[n];
}
// KONIEC ODEJMOWANIA
//NALEZY TERAZ 'SPISAC' KOLEJNA CYFRE. JESLI JEJ BRAK, WOWCZAS BIERZEMY 0
// algorytm: jesli WYNMIN bedzie rozny od 0, wowczas przesun WINMIN o jedna
// komorke i dziel dalej (WYNMIN=0 oznacza ze reszta = 0 zatem koniec dzielenia)
a=0;
printf("WYNMIN[n]\n");
for (n=99; n>=0; n--){printf(" %d", WYNMIN[n]);}
for (n=99; n>=0; n--)
{
if (WYNMIN[n] != 0)
{
a=WYNMIN[n]; //poszerzamy po to, zeby X[i] w to miescic z-razy ^^
WYNMIN1[n+1]=a;
}
}
printf("\nWYNMIN1[n]\n");
for (m=99; m>=0; m--){printf(" %d", WYNMIN1[m]);}
//------------------------------------------------------------------------------
//nalezy wpisac na gore do wyniku i przemnozyc przez X[i], odjac i sprawdzic czy jest reszta
// TERAZ MNOZYMY z PRZEZ LICZBE PRZEZ KTORA DZIELIMY CZYLI PRZEZ X[i]
//
m=0;
for (i=0; i<99; i++)
{
Z[i]=X[i]*Wz+m;
m=0;
while (Z[i] >= 10 ) //CHCEMY WIEDZIEC ILE BEDZIE TRZEBA DODAC
{ //DO LICZBY JAKO 'DODANA'
Z[i] = Z[i] - 10;
m++;
}
}
// for (l=99; l>=0; l--){printf(" %d", Z[l]);}
// Z[i] BEDZIEMY ODEJMOWAC OD WYNIK1[i]. WYNIK DA NAM "RESZTE" (albo i nie)
// ZACZYNAMY ODEJMOWAC OBIE POWYZSZE RZECZY
printf("\n");
for (n=0; n<=99; n++)
{
if (Z[n] > WYNMIN1[n])
{
WYNMIN1[n]=WYNMIN1[n]+10;
WYNMIN1[n+1]=WYNMIN1[n+1]-1;
}
WYNMIN[n]=WYNMIN1[n]-Z[n];
}
return 0;
}