PI do 200 miejsc po przecinku [C]

0

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;
}
0

Podobne zadanie (tylko chyba bez ograniczenia do 200 liczb...) możesz znaleźć na www.spoj.pl :)
Poprzeglądaj ichniejsze forum, może ktoś podawał jakieś ciekawe rozwiązania.

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