PDA

View Full Version : [C++, Java, C, VB, etc...] risoluzione combinazioni


misterx
18-03-2004, 09:15
abbiamo 2 variabili che possono assumere il valore 0 oppure 1

qualcuno ci insegna che possiamo scrivere le seguenti combinazioni:

0 0
0 1
1 0
1 1

bene; sembrerebbe che rispondendo alla regola 2^2^n dove n rappresenta il numero di variabili, sia possibile ottenere 16 colonne formate dalle combinazioni di 0 e 1 possibili

esempio:

0 1 1 ... fino a 16 colonne
0 1 0 ...
0 1 0 ...
0 1 0 ...

sarebbe comodo se ci pensasse un programmetto scritto all'uopo e per la regola dell'acqua calda ci scommetto che l'avete gią scritto, quindi: postate il vostro codice

ri
18-03-2004, 09:24
e a che ti serve?
scuola? spero di no, perchč altrimenti (da parte mia) ti scordi qualsiasi riga di codice pronta

misterx
18-03-2004, 09:30
Originariamente inviato da ri
e a che ti serve?
scuola? spero di no, perchč altrimenti (da parte mia) ti scordi qualsiasi riga di codice pronta


se fosse per la scuola ci penserei da me ;)

č per mia curiositą personale

fosse una serie di numeri come ad esempio:

1 2 3 4
1 2 4 3
4 3 2 1
etc......

me la caverei con un certo numero di cicli for nidificati

ma con 0 e 1 non mi viene in mente nulla; di sicuro se cerco in rete qualcosa c'č gią ma vai a capire cosa cercare

ri
18-03-2004, 09:37
Originariamente inviato da misterx
se fosse per la scuola ci penserei da me ;)


brav :)

ora sono un po' intasato in ufficio, se posso ci penso

VICIUS
18-03-2004, 09:42
Non č che ti serve la formula delle combinazioni con ripetizione ?
Cr(n,k) = (n+k-1)! / (n-1)!*k!
con n=2 e k=16.

ciao ;)

misterx
18-03-2004, 13:10
Originariamente inviato da VICIUS
Non č che ti serve la formula delle combinazioni con ripetizione ?
Cr(n,k) = (n+k-1)! / (n-1)!*k!
con n=2 e k=16.

ciao ;)



meglio

2^n = numero di righe

2^2^n = numero di colonne

anx721
18-03-2004, 22:09
int n = 2;
//2^n
int n_2 = (int)Math.pow(2.0, n);
//2^2^n
int n_2_2 = (int)Math.pow(2.0, n_2);
int temp = 1;

for(int i = 0; i < n_2; i++){
for (int j = 0; j < n_2_2 ; j = j + temp){
for(int k = 0; k < temp ; k++){
if(((j / temp) % 2) == 0)
System.out.print("0");
else
System.out.print("1");
}
}
temp = temp * 2;
System.out.println();
}


Se n > 2 č gią difficile visualizzare il risultato...

misterx
19-03-2004, 22:20
lo stavo controllando e sembrerebbe che qualche problemino c'č nel tuo codice

ancora qualche test per sincerarmene

cmq, grazie 1000:)

/\/\@®¢Ų
19-03-2004, 23:01
Originariamente inviato da anx721

int n_2 = (int)Math.pow(2.0, n);
int n_2_2 = (int)Math.pow(2.0, n_2);


occhio che a priori non sei sicuro che non vengano effettuati arrotondamenti nella conversione tra float e interi (alcuni interi non sono rappresentabili come float)
visto che la base e' due meglio scrivere

int n_2 = ( 1 << n )
int n_n_2 = ( 1 << n_2 )

tra l'altro qui si vede bene che se n e' piu' grande di 5, n_2 diventa > 32 e quindi n_n_2 sfora.

anx721
19-03-2004, 23:16
L'importante č che sia corretto l'algoritmo ;)

/\/\@®¢Ų
19-03-2004, 23:51
Originariamente inviato da anx721
L'importante č che sia corretto l'algoritmo ;)
Vero, ma anche il risultato vuole la sua parte :D ;)

anx721
19-03-2004, 23:58
Si, ma i dettagli implementativi ognuno se li vede, anche in base al linguaggio scelto, comuqnue le tue osservazioni sono giuste, anche se non capito il fatto dell'arrorondamento ;)

/\/\@®¢Ų
20-03-2004, 01:25
Originariamente inviato da anx721
Si, ma i dettagli implementativi ognuno se li vede, anche in base al linguaggio scelto
Figurati, volevo solo avvertirti perche' quel tipo di bug e' abbastanza insidioso.
[quote
comuqnue le tue osservazioni sono giuste, anche se non capito il fatto dell'arrorondamento ;) [/QUOTE]
Con un numero in virgola mobile non riesci a rappresentare tutti i numeri interi presenti in un int. Sulla mia macchina ad esempio il seguente codice ritorna false:


bool foo()
{
int n = 16777217;
float f = n;
return f == n;
}

/\/\@®¢Ų
20-03-2004, 01:36
Originariamente inviato da misterx
abbiamo 2 variabili che possono assumere il valore 0 oppure 1

qualcuno ci insegna che possiamo scrivere le seguenti combinazioni:

0 0
0 1
1 0
1 1

Giusto una piccola curiositą:
se guardi bene quelle che stai scrivendo sono le rappresentazioni binarie dei numeri a 2 ( o in generale piu' ) bit
Una soluzionie decisamente compatta potrebbe essere la seguente:

int bits = 31;
for ( int i=0 ; i< INT_MAX ; ++i )
{
for ( int j = bits-1 ; j >= 0 ; --j )
{
cout << (( i & (1<<j) ) != 0) << ' ';
}
cout << endl;
}

anx721
20-03-2004, 11:34
La conversione da int a float dą in effetti problemi in c, infatti con con

int n = 16777217;
float f = n;

stampando n ed f ottengo:

n = 16777217
f = 16777216.0000

Penso dipenda dal numero di bit utilizzati per rappresentare il numero; in java invece funziona.

In c basta usare double invece di float.

Quanto al tuo codice alternativo, non conosco bene gli operatori del c++, ma ci credo che sia giusto ;)

VICIUS
20-03-2004, 12:44
Originariamente inviato da misterx
meglio

2^n = numero di righe

2^2^n = numero di colonne

Saro pignolo io ma m^n č la formula delle disposizioni con ripetizione e non delle combinazioni.

ciao ;)

misterx
20-03-2004, 19:01
Originariamente inviato da VICIUS
Saro pignolo io ma m^n č la formula delle disposizioni con ripetizione e non delle combinazioni.

ciao ;)



che avesse un nome lo so ora :)

beh, meglio sarebbe disposizioni senza ripetizioni....

forse non sono stato molto chiaro nella mia esposizione

verloc
21-03-2004, 15:01
aspetta un paro di giorni che ti do la roba fatta da me.

Il ragazzo ha ragione: quelle erano le disp. :p

hey Misterix
domani...toccando palle...