Pagini recente » Cod sursa (job #2204627) | Cod sursa (job #882270) | Cod sursa (job #1964688) | Cod sursa (job #838214) | Cod sursa (job #283788)
Cod sursa(job #283788)
#include <stdio.h>
int A,B,K,C;
int a[16],x[16],nr[16],p9[16];
int compute(int N){
int nr_cif=0,i,j,t,aux=N,sol=0;
while (aux>0) {
++nr_cif;
aux/=10;}
i=nr_cif;
aux=N;
while (aux>0) {
a[i--]=aux%10;
aux/=10;
}
int put=(1<<nr_cif);
for (i=0;i<put;++i){
t=0;
for (j=0;j<nr_cif;++j)
if ((1<<j)&i) ++t;
if (t<K) continue;
for (j=0;j<nr_cif;++j){
x[j+1]=-1;
if ((1<<j)&i) x[j+1]=C;
}
nr[nr_cif+1]=0;
for (j=nr_cif;j;j--)
if (x[j]==-1) nr[j]=nr[j+1]+1;
else nr[j]=nr[j+1];
for (j=1;j<=nr_cif;++j)
if (x[j]==-1){
t=a[j];
if (t>C) t--;
sol+=t*p9[nr[j+1]];
if (a[j]==C) break;
}
else if (x[j]<a[j]) {
sol+=p9[nr[j+1]];
break;
}
else if (x[j]>a[j])
break;
if (j>nr_cif) ++sol;
//printf("%d %d\n",sol,i);
}
return sol;
}
int main(){
int i;
freopen("cifre.in","r",stdin);
freopen("cifre.out","w",stdout);
scanf("%d %d %d %d",&A,&B,&C,&K);
p9[0]=1;
for (i=1;i<=10;++i) p9[i]=p9[i-1]*9;
int r=compute(B)-compute(A-1);
//printf("%d\n",r);
printf("%lf",(double)r/(double)(B-A+1));
return 0;
}