Problema con algoritmo matematico

di il
8 risposte

Problema con algoritmo matematico

Sera a tutti. Stavo cercando di fare un programmino che calcola i coefficienti binomiali, ho messo a punto un sistema per calcolare prima in numeratore del risultato e poi il denominatore, il risultato finale è il quoziente fra i 2. Il problema è che non funziona, anche se a me sembra giusto...ecco il codice:
#include<stdio.h>


int main()
{
    
int n,k,i,j,r1,r2;
double r;
  
  printf("Calcolatore di coefficienti binomiali. Inserisci il coefficiente n: \n");  
   scanf("%d", &n);
   scanf("%d", &k);

 r1=n;
 r2=k;
 i=k-1;
 j=k;
  if (k=1) {                              // Caso in cui k=1
        printf("Il risultato e' %d", &n);
        }
     else if (k==0 || k==n) {             // Caso in cui k=0 oppure k=n
        printf("Il risultato e' 1");
        }
     else {                               // Caso generale
        for (i=k-1; i>0; i--) {           // Numeratore
           r1=r1*(n-1);                   
           n--;
        }
        for (j=k; j>0; j--) {             // Denominatore
           r2=r2*(k-1);
           k--;
        }
        r=r1/r2;                          // Risultato finale
     }
     
     int P;
     scanf("%d", &P);
       
    
return 0;
}
  
Il fatto strano è che nel secondo caso (n=0 o n=k) funziona, mi stampa a video il risultato che è 1, mentre nel primo caso (k=1) invece di stamparmi il valore di n come risultato, mi stampa 2686756 (per ogni n). Infine, nel caso generale, il programma crasha. Avete qualche spiegazione??

8 Risposte

  • Re: Problema con algoritmo matematico

    
    ...
    17:   if (k=1) 
    18: printf("Il risultato e' %d", &n);
    ...
    
    
           ...
           for (i=k-1; i>0; i--) {           // Numeratore
               r1=r1*(n-1);                   
               n--;
           ...
     
    qui r1 (o r2 nell'altra iterazione) potrebbero essere a zero
  • Re: Problema con algoritmo matematico

    ixamit ha scritto:


    
    ...
    17:   if (k=1) 
    18: printf("Il risultato e' %d", &n);
    ...
    
    
           ...
           for (i=k-1; i>0; i--) {           // Numeratore
               r1=r1*(n-1);                   
               n--;
           ...
     
    qui r1 (o r2 nell'altra iterazione) potrebbero essere a zero
    Non ti seguo scusa, io ho già definito r1 e r2, ponendo il primo = n e il secondo = k, prima dei 2 cicli. Quindi ri e r2 sono uguali a 0 solo se n e k lo sono.
  • Re: Problema con algoritmo matematico

    Scusa a volte sono un po troppo sintetico...

    Dopo aver corretto il 'k=1' che non è un confronto ma bensì un'assegnazione, e la printf (senza ampersand) la seconda parte canna sul fattoriale... facciamo qualche passo indietro...

    se ho 5 e 3 il numeratore dovrebbe essere 120 ed il denominatore 12.
    Il tuo numeratore è 60 e denominatore zero --> division by zero || arithmetic exception || operazione impossibile

    Io conosco questa formula n!/k!*(n-k)! e la tua non la capisco
  • Re: Problema con algoritmo matematico

    ixamit ha scritto:


    Scusa a volte sono un po troppo sintetico...

    Dopo aver corretto il 'k=1' che non è un confronto ma bensì un'assegnazione, e la printf (senza ampersand) la seconda parte canna sul fattoriale... facciamo qualche passo indietro...

    se ho 5 e 3 il numeratore dovrebbe essere 120 ed il denominatore 12.
    Il tuo numeratore è 60 e denominatore zero --> division by zero || arithmetic exception || operazione impossibile

    Io conosco questa formula n!/k!*(n-k)! e la tua non la capisco
    Io sto seguendo la formula "veloce", cioè n(n-1)(n-2)......(n-k+1)/k!, per cui con 5 e 3 il numeratore è uguale a 5*4*3=60 e in denominatore è 3*2*1=6, che in fin dei conti è la medesima cosa di 120/60. Ho provato a mettermi nei "panni della macchina", e eseguendo quei cicli il risultato dovrebbe essere proprio quello giusto. Mi era venuto solo il dubbio che per poter definire r=r1/r2 debba considerare i procedimenti per il denominatore e per il nuemratore come funzioni a parte che mi ritornino rispettivamente r1 e r2. Ho provano ma mi son incasinato non poco, e sono tornato indietro.

    ps: adesso ho provato a sistemare lo scanf iniziale, scrivendone uno solo come:
    scanf("%d %d", &n, &k);
    il risultato è che qualunque cosa metta, il programma mi restituisce 2686756 come risultato. Davvero, non ne capisco il senso, visto che, anche se il caso generale fosse fallato, i casi particolari sono descritti in chiaro e tondo! Come può resituire quel numero se gli dico chiaramente che se k=0 o k=n mi deve dare 1 mentre se k=1 deve darmi 0??? Lo stovo alquanto inquietante...
  • Re: Problema con algoritmo matematico

    
    printf("Il risultato e' %d", &n);
    
    Questo ti restituisce la locazione di memoria di n non il valore di n, togli il &
    
    printf("Il risultato e' %d", n);
    
  • Re: Problema con algoritmo matematico

    Forse intendevi questo:
    
    #include<stdio.h>
    
    
    int main()
    {
    
    	int n,k,r1,r2;
    	double r;
    
    	printf("Calcolatore di coefficienti binomiali. Inserisci il coefficiente n: \n"); 
    	scanf("%d", &n);
    	scanf("%d", &k);
    
    	r1=n;
    	r2=k;
    
    	if (k==1) {                              // Caso in cui k=1
    		printf("Il risultato e' %d", n);
    	}
    	else if (k==0 || k==n) {             // Caso in cui k=0 oppure k=n
    		printf("Il risultato e' 1");
    	}
    	else {                               // Caso generale
    		while(n > k){
    							           // Numeratore
    			r1=r1*(n-1);                   
    			n--;
    		}
    		while(k > 1){
    						             // Denominatore
    			r2=r2*(k-1);
    			k--;
    		}
    		r=r1/r2;                          // Risultato finale
    		printf("Il risultato e' %.2f",r);
    	}
    
    
    	int P;
    	scanf("%d", &P);
    
    
    	return 0;
    }
    
  • Re: Problema con algoritmo matematico

    Un'attenzione sulla divisione dei due interi su double che andrebbe castata o meglio dichiarare double anche il dividendo ed il divisore visto che contengono valori fattoriali.

    @skynet ieri sera mi hai bruciato sulla risposta. phpbb mi ha bloccato segnalandomi che sono troppo lento ;p
  • Re: Problema con algoritmo matematico

    Si scusa, ho fatto na cagata e ho confuso prinf con scanf. In effetti 2 milioni e rotti probabilmente era la posizione in memoria di n. Comunque, tu hai usato dei cicli while, però in linea teorica anche i miei for dovrebbero funzionare, sai dirmi perchè non funzionano invece?


    edit: ok, adesso funziona
    #include<stdio.h>
    
    int main()
    {
        
    int n,k,i,j;
    double r,r1,r2;
    char scelta;
    int exit = 0;
    
    do {
      printf("Calcolatore di coefficienti binomiali. \nInserisci il coefficiente n: \n");  
       scanf("%d", &n);
      printf("Inserisci il coefficiente k: \n");
       scanf("%d", &k);
    
     r1=n;
     r2=k;
      if (k==1) {                              // Caso in cui k=1
            printf("Il risultato e' %d \n", n);
            }
         else if ((k==0 && k!=1) || k==n) {             // Caso in cui k=0 oppure k=n
            printf("Il risultato e' 1 \n");
            }
         else {                               // Caso generale
            for (i=k; i>1; --i) {           // Numeratore
               r1 *= n-1;                   
               n--;
            }
            for (j=k; j>1; --j) {             // Denominatore
               r2 *= k-1;
               k--;
            }
            r=r1/r2;                          // Risultato finale
            printf("Il risultato e' %f \n", r);
         }
         
         printf("Vuoi uscire? (s/n) \n");
         scanf("%s", &scelta);
         if (scelta == 'n')
            exit = 0;
            else if (scelta == 's')
               exit = 1;
            }    while (exit==0);
        
    return 0;
    }
      
    
Devi accedere o registrarti per scrivere nel forum
8 risposte