Trójkąt pascala

0

Witajcie, otóż muszę napisać w C++ trójkąt pascala bez użycia tablic. Mam taki kod, trójkąt ładnie się tworzy, jednak dostałem informację od nauczyciela, że program ten potrzebuje zmian, jednak nie wiem co tu można jeszcze zrobić. Może coś poradzicie? Pozdrawiam

#include <iostream>

using namespace std;

int main()
{
int liczba;
cout << "Podaj liczbe wierszy dla Trojkata Pascala " ;

cin >> liczba;

if (liczba<=0)
cout<<"Liczba wierszy musi byc dodatnia";



int a;
for(a=0;a<liczba;a++)
{

long long int o,b;
for(o=0;o<(liczba-a);o++)
cout<<" ";
for(b=0;b<=a;b++)
{

long long int k=1,i;
for(i=1;i<=a;i++)
k=k*i; //k=n!

long long int NS=k; k=1;
for(i=1;i<=b;i++)
k=k*i; //k=k!

long long int KS=k; 
k=1;
for(i=1;i<=(a-b);i++)
k=k*i; //k=(n-k)!
long long int N_KS=k; 

long long int W=NS/(KS*N_KS); 

cout << W << " ";
}

cout<<endl;


}
return 0;
}
0

No nie wiem... Mógłbyś na przykład sformatować kod :P

0

A mógłbym np. jakoś inaczej zapisać symbol newtona? Jakieś propozycje? Chodzi o to, żeby był bardziej zwarty.

0

Liczysz tutaj dużo rzeczy niepotrzebnie. Nauczycielowi pewnie chodziło, żebyś sumował odpowiednie wyrażenia z wiersza poprzedniego, dzięki temu program będzie się wykonywał dużo szybciej, dodatkowo dopiero przy dalszych wierszach masz ryzyko przepełnienia typu danych.

0

Za użycie silni do liczenia symbolu Newtona powinno się pozbawiać dostępu do komputera na tydzień, a za użycie silni do tworzenia trójkąta Pascala na rok.

0

Dajmy na to, że pozbawili mnie już dostępu do komputera na rok i mam samą kartkę, więc czego mam użyć, żeby nie używać tablic?

0

Proszę o wskazówkę co do liczenia, z góry dziękuję

0

Przeoczyłem, że masz zakaz korzystania z tablic, skracam karę.
Ty liczysz tak: C(8,3)=8!/(5!3!), dla trochę większych liczb dostajesz przepełnienie.
Licz tak: 8!/(5!3!)=(87
654321)/((54321)(321))=(po skróceniu)=(876)/(32*1)=(po zmianie kolejności działań)=((((8/1)*7)/2)*6)/3.
Jeśli mógłbyś użyć tablic i pamiętać wyniki wcześniejsze, to
1
1 1
1 2 1
1 3 3 1
..........
i kolejne wyrazy trójkąta dostajesz przez dodawanie.

0

Użyj rekurencji (ble)...

Patrz "Programy obliczające":
http://pl.wikipedia.org/wiki/Tr%C3%B3jk%C4%85t_Pascala

0

to tak na szybko :D - trojkat sie sypie przy duzych liczbach bo nalezaloby spacje wyliczyc a to zalezy od dlugosci cyferek :)

 
#include <cstdlib>
#include <iostream>

using namespace std;


int  licz(int n,int k)
{
  if ((k==0) || (k==n)) return 1; 
  return  licz(n-1, k-1) + licz(n-1,k);
}

int main(int argc, char *argv[])
{
int n,k,j,s;
cout <<"podaj n:";  
cin >>n;


for (j=0 ; j < n; j++)
{  

   for (s= n  -j ; s > 0 ; s--)
   {cout <<" ";}  //tylko spacje
      
       for (k=0 ; k<j +1  ; k++ )
       {
        cout<<licz (j,k)<<" ";
       }
 cout <<endl;
}

    system("PAUSE");
    return EXIT_SUCCESS;
}
0

@Piotrekdp, idź się wstydzić do konta.

  1. Twoja rekurencja prowadzi do tego, że każdy symbol Newtona liczysz przez sumowanie jedynek.
  2. C(15,7)=C(14,7)+C(14,6)=C(13,7)+C(13,6)+C(13,6)+C(13,5)=... => C(13,6) liczysz dwukrotnie, na dalszych etapach rekurencji liczba niepotrzebnych obliczeń szybko rośnie.
  3. Po wyliczeniu C(15,7) będziesz za chwile od nowa liczył C(15,8), chociaż C(15,8)=C(15,7).
  1. jest konsekwencją tego, że nie można użyć tablic. Ale 1) i 2) to Twój twórczy wkład do zagadnienia.
long C(int n,int k)
{
     long wynik=1L;
     int i=1;
     int ile=k;
     while(ile>0)
     {
          wynik*=n;
          wynik=wynik/i;
          n--;
          i++;
          ile--;
     }
     return wynik;
}

Typ long można zamienić na największy typ całkowity. Nie znam C++ i ie wiem jak się taki typ nazywa.

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