enum TYPE_COMB { LE16=-1, EQ17=0, EQ21=4, B_JACK=5, GE22=6 };
enum IND_CARDS { CARD_2=0, CARD_10=8, CARD_A=9 };
int ResultForDiler( int n_cards, int *Cards )
{
int ii, num_ace, sum_hard, sum_ace, sum_all;
for( ii=sum_hard=sum_ace=num_ace=0; ii= 22 )
return GE22;
} else
sum_ace += ((num_ace++)? 1 : 11);
}
sum_all = sum_hard + (((sum_hard + sum_ace) >= 22)? num_ace : sum_ace);
if( sum_all == 21 && n_cards == 2 )
return B_JACK;
return ((sum_all >= 22)? GE22 : (sum_all <= 16)? LE16 : (sum_all-17));
}
void AnalHitDiler( void )
{
double CurPart[12], CurMul[12], PercComb[10][7];
int ii, is, res, n_cards, Cards[12];
for( is=CARD_2; is<=CARD_A; is++ ) {
for( ii=0; ii<7; ii++ )
PercComb[is][ii] = 0.;
CurPart[0] = CurMul[0] = 1.;
Cards[0] = is;
n_cards = 1;
while( 1 ) {
if( (res = ResultForDiler(n_cards, Cards)) == LE16 ) {
CurPart[n_cards] = (1./13.);
CurMul[n_cards] = CurMul[n_cards-1] * CurPart[n_cards];
Cards[n_cards++] = CARD_2;
} else {
PercComb[is][res] += CurMul[n_cards-1];
while( (++Cards[n_cards-1] > CARD_A) ) {
if( --n_cards == 1 )
goto NEXT;
}
ii = n_cards - 1;
CurPart[ii] = ((Cards[ii] == CARD_10)? 4. : 1.)/13.;
CurMul[ii] = CurMul[ii-1] * CurPart[ii];
}
}
NEXT:;
}
// Здесь возможна печать найденных параметров:
// массив PercComb[10][7] соответствует таблице "Набор
// карт дилером", представленной на сайте www.lig.ru
// Отличие только при переборе на 8-ке. - На сайте
// опечатка: указано 24.27, правильно - 24.47
}
void main( void )
{ AnalHitDiler(); }