Pagini recente » Cod sursa (job #1638623) | Cod sursa (job #972307) | Cod sursa (job #1316563) | Cod sursa (job #1243059) | Cod sursa (job #52755)
Cod sursa(job #52755)
#include<stdio.h>
int C,K;
int a[15],n,b[15];
int p9[15];
int valid(int x)
{
int i,nr=0;
for(i=0;i<n;i++)
if( (1<<i) & x )
nr++;
if(nr>=K)
return 1;
return 0;
}
int f(int x)
{
if(!x)
return 0;
int varza,i,nr,tot=0,j,k;
varza=x;
n=0;
while(varza)
{
a[++n]=varza%10;
varza/=10;
}
if(n-1 != 0)
{
for(k=K;k<=n-1;k++)
tot+=(n-1-k)*p9[n-1];
tot++;
}
for(i=0;i<((1<<n)-1);i++)
if(valid(i))
{
varza=x;
n=0;
while(varza)
{
a[++n]=varza%10;
varza/=10;
}
nr=0;
for(k=0;k<n;k++)
if( ((1<<k) & i) )
{
b[k+1]=C;
nr++;
}
else
b[k+1]=a[k+1];
j=n-1;
while(j>=0 && ((1<<(j))&i)==0 ) j--;
j++;
if(j==n || C > a[n]);
else
{
if(j==1 || C<a[j]);
else
{
j++;
while(j<=n && b[j]==0)
{
b[j]=9;
j--;
}
b[j]--;
while(b[n]==0) n--;
}
}
nr=n-nr;
for(k=n;k;k--)
if( ((1<<(k-1)) & i) );
else
{
nr--;
if(k==n)
{
if(b[k]>=C)
tot+=(b[k]-1)*p9[nr];
else
tot+=b[k]*p9[nr];
}
else
{
if(b[k]>C)
tot+=(b[k])*p9[nr];
else
tot+=(b[k]+1)*p9[nr];
}
}
}
varza=x;
n=0;
while(varza)
{
a[++n]=varza%10;
varza/=10;
}
for(i=1;i<=n;i++)
b[i]=C;
i=n;
while(i && a[i]==b[i]) i--;
if(!i || a[i]>b[i])
tot++;
return tot;
}
int main()
{
FILE *fin=fopen("cifre.in","r"),
*fout=fopen("cifre.out","w");
int A,B,nr;
fscanf(fin,"%d%d%d%d",&A,&B,&C,&K);
p9[0]=1;
for(nr=1;nr<=12;nr++)
p9[nr]=p9[nr-1]*9;
if(C)
nr=f(B)-f(A-1);
else
nr=1;
double sol=(double)nr/(double)(B-A+1);
fprintf(fout,"%.4f\n",sol);
fclose(fin);
fclose(fout);
return 0;
}