Symbol newtona - działanie pewnej funkcji

0

Otóż, mam taki oto kod, który oblicza symbol newtona:

#include <stdio.h>
#include <stdlib.h>

int Min(int a, int b)
{
    // funkcja minimum
}
  
int SymNew(int n, int k)
{
    int i, j;
    int B[k];
    
    for(j = 0; j <= n; j++) B[j] = 1;
    for(i = 1; i <= n; i++){
          for(j = Min(i - 1, k); j >= 1; j--){
                B[j] = B[j - 1] + B[j];
                }
          }
    return B[k];
}

int main ()
{
    int N, K;
    printf("Podaj N: ");
    scanf("%d", &N);
    printf("Podaj K: ");
    scanf("%d", &K);
    
    if(N < K) printf("Blad! N musi byc wieksze, lub rowne K.\n");
    else
    {
    int WYNIK;
    WYNIK = SymNew(N, K);
    printf("%d <-- WYNIK\n", WYNIK);
    }

    getchar();
    getchar();
    return 0;
}

(Kompiluje za pomocą Dev-C++ Portable 4.9.9.2 na WinXP)

Sprawa wygląda tak:

Jeżeli zamiast " B[k] " napiszę " B[n] " (linijka 12) oraz zamiast " Min(i - 1, k) " napiszę samo " i - 1 " (linijka 16) - program działa bez zarzutu.

Niestety oprócz tego sposobu działania programu, muszę zrobić jeszcze jeden - w takiej postaci, w jakiej wkleiłem kod.

Pytanie moje brzmi: Co ma robić funkcja Min ? Bo raczej nie ma wybierać elementu mniejszego z podanych dwóch (ponieważ kiedy tak zrobiłem, na niektórych przykładach program się wykrzaczał, vide 9 po 1).

Funkcja ta miała taką postać:

int Min(int a, int b)
{
    if(a <= b) return a;
    if(a > b ) return b;
}

Z góry dzięki za odpowiedź.

0

na moje oko zwraca wartość minimalną, a jeśli są równe to tą pierwszą.
To samo mozesz osiągnąć przez

min = (a <= b) ? a : b;
0

Czyli, że tak ma wyglądać moja funkcja? :p

int Min(int a, int b)
{
    int min;
    min = (a <= b) ? a : b;
    return min;
}

W takiej postaci się sypie, nadal. Tak w ogóle, to nie wiem czym jest ten "?". Jak można by było, bez niego, to super :D.

0

int Min(int a, int b){return a<b ? a : b;}
...
zamiast
for(i = 1; i <= n; i++){
niech bedzie
for(i = 2; i <= n; i++){
...
return B[k];

0

aha, mialo byc bez "?"

int Min(int a, int b){
if (a<b) return a;
else return b;
}

0

Niestety :(

Nawet po wprowadzeniu powyższych poprawek np. dla 13 po 3... sypie się nie miłosiernie. Dla kilku innych przykładów także.

0

Ale my się chyba nie rozumiemy. My podaliśmy jak napisać funkcje wybierającą minimum z 2 liczb, dającą ten sam wynik co funkcja którą podałeś. Nikt tu nie analizował reszty algorytmu, a głowe dam ze bląd jest gdzieś tam.

0

jest
int B[k];
a powinno byc
int B[k+1];

dzieki Min() liczy sie troszke szybciej
dodalbym jeszcze
if (n-k<k) k=n-k;

Tak czy siak, liczenie przy pomocy trojkata Pascala nie jest optymalne
np. newton(13,3)=13/112/211/3

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