Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    31

    [C++] Software calcolo combinatorio

    Ciao!
    Starei provando a scrivere un software per il calcolo combinatorio, ma non so come implementare le permutazioni con ripetizione, ottengo risultati scorretti e strani errori con le combinazioni semplici e con ripetizioni e temo di aver fatto qualche errore concettuale.
    Ci date un'occhiata?

    Grazie mille

    codice:
    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int fattoriale(int numero){
    	if (numero == 1) {
    		return 1;
    	}
    	if (numero == 0) {
    		return 1;
    	}
    	int i;
    	int f=1;
    	for (i=1;i<=numero;i++){
    		f=f*i;
    	}
    	return f;
    }
    
    int Permuta(int elementi){
    	int ris;
    	ris = fattoriale(elementi);
    	cout <<" = " << ris << "\n\n";
    }
    
    int Disponi(int n, int k){
    	int ris =1;
    	for (int i=k;i>0;i--){
    		ris=ris *n;
    		k--;
    		n--;
    	}
    	cout <<" = " << ris << "\n\n";
    }
    
    int DisponiR(int n, int k){
    	int ris;
    	ris=pow(n,k); // pow(base, esponente)=base^esponente
    	cout <<" = " << ris << "\n\n";
    }
    
    int Combina(int n, int k){
    	//da rivedere
    	int ris;
    	ris = (fattoriale(n))/(fattoriale(n-k)*fattoriale(k));
    	cout <<" = " << ris << "\n\n";
    }
    
    int CombinaR(int n, int k){
    	int ris;
    	ris = (fattoriale(n-k+1))/(fattoriale(n-2*k+1)*fattoriale(k));
    	cout <<" = " << ris << "\n\n";
    }
    
    int main() {
    	int elementi;
    	int gruppi;
    	char permutazioni;
    	char ripeti;
    	char disposizioni;
    	char combinazioni;
    	char ordine;
    	
    	cout << "Software base di calcolo combinatorio - Colleoni Alessandro\n";
    	cout << "Quanti elementi desideri considerare? ";
    	cin >> elementi;
    	cout << "I gruppi di elementi sono dello stesso numero di elementi del totale? [s/n] ";
    	cin >> permutazioni;
    	if(permutazioni == 'n') {
    		cout << "Allora i gruppi saranno formati da quanti elementi? ";
    		cin >> gruppi;
    		cout << "L'ordine ha importanza? [s/n] ";
    		cin >> ordine;
    		}
    	cout << "Ci possono essere ripetizioni? [s/n] ";
    	cin >> ripeti;
    	
    	if(permutazioni == 's' && ripeti == 's'){
    		cout << "Quante volte si ripetono quali elementi? (se si ripetono 2 volte un elemento e 3 volte un altro scrivi 2,3)";
    		//cin???
    		cout << "Permutazioni con ripetizione di " << elementi;
    	//	PermutaR(elementi);
    		return 0;
    	}
    	if(permutazioni == 's' && ripeti == 'n'){
    		cout << "Permutazioni di " << elementi;
    		Permuta(elementi);
    		return 0;
    	}
    	if(ordine == 'n' && ripeti=='s') { 
    			cout << "Combinazioni con ripetizione di " << elementi  << " elementi di classe "<< gruppi;
    			CombinaR(elementi, gruppi);
    		return 0;
    	}
    	if(ordine == 'n' && ripeti=='n') {
    			cout << "Combinazioni di " << elementi  << " elementi di classe "<< gruppi;
    			Combina(elementi, gruppi);
    		return 0;
    	}
    	if(ordine == 's' && ripeti=='s') {
    			cout << "Disposizioni con ripetizione di " << elementi << " elementi di classe "<< gruppi;
    			DisponiR(elementi, gruppi);
    		return 0;
    	}
    	if(ordine == 's' && ripeti=='n') {
    			cout << "Distribuzioni di " << elementi  << " elementi di classe "<< gruppi;
    			Disponi(elementi, gruppi);
    		return 0;
    	}
    	cout << "Se leggi questo messaggio probabilmente qualcosa non ha funzionato";
    	return 0;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    Non ho controllato il codice..
    Ma ho visto che nella funzione fattoriale hai messo due if che sono inutili visto che ritorna comunque 1, inoltre conviene far partire i da 2 al posto che da 1.
    Puoi anche risparmiarti una variabile andando a decremento:
    codice:
    int fattoriale(int numero){
    
    	int f = 1;
    
    	while (numero > 1)
    		f *= numero--;
    	
    	return f;
    }
    Ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    24
    potresti provare con un metodo ricorsivo piuttosto che iterativo..
    in pratica chiami fattoriale all'interno di fattoriale stesso!
    esistono 10 modi di sapere il binario:
    o lo sai o non lo sai...

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    31
    Ringrazio per i suggerimenti ma gli if eccetera erano più per aiutarmi a capire quello che stavo facendo (ho cercato di scrivere il codice come se stessi spiegando le definizioni ad una persona.... per capire meglio anche io l'argomento).
    In ogni caso rimarrebbero aperte le questioni che avevo posto inizialmente, ovvero le funzioni non ancora implementante o non funzionanti.

    grazie mille

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.