Pagini recente » Cod sursa (job #238424) | Cod sursa (job #1732649) | Cod sursa (job #1784469) | Cod sursa (job #2356945) | Cod sursa (job #1551317)
#include <stdio.h>
#include <string.h>
#define MAX_N 10
int dig, freq;
int D[MAX_N][MAX_N];
int memo( int N, int f ) {
if ( N == 0 ) {
return ( f >= freq );
}
if ( D[N][f] != -1 ) {
return D[N][f];
}
int i, q;
q = 0;
for ( i = 0; i < 10; i++ ) {
q += memo( N - 1, f + ( dig == i ) );
}
D[N][f] = q;
return q;
}
int DP( int X ) {
char buf[MAX_N];
int N, i, j, currDig, q, fr;
sprintf( buf, "%d", X );
N = strlen( buf );
q = fr = 0;
for ( i = 0; i < N; i++ ) {
currDig = buf[i] - '0';
for ( j = 0; j < currDig; j++ )
q += memo( N - i - 1, fr + ( dig == j ) );
fr += ( currDig == dig );
}
return q;
}
int main(void) {
FILE *fin, *fout;
int A, B, i, j;
fin = fopen( "cifre.in", "r" );
fscanf( fin, "%d%d%d%d", &A, &B, &dig, &freq );
fclose( fin );
for ( i = 0; i < MAX_N; i++ )
for ( j = 0; j < MAX_N; j++ )
D[i][j] = -1;
fout = fopen( "cifre.out", "w" );
fprintf( fout, "%.4f\n", 1.00 * ( DP(B+1) - DP(A) ) / (B-A+1) );
fclose( fout );
return 0;
}