Pagini recente » Cod sursa (job #2752980) | Cod sursa (job #1963619) | Cod sursa (job #202078) | Cod sursa (job #2769991) | Cod sursa (job #501037)
Cod sursa(job #501037)
#include<cstdio>
#include<iostream>
using namespace std;
const int KMAX = 10;
int A, B, C, K, nr_cifre;
int cf[KMAX];
int REZ;
void citire()
{
cin >> A >> B >> C >> K;
int B2 = B;
while(B2)
nr_cifre++, B2 = B2 / 10;
}
int fa_numar(int A[])
{
int rez = 0;
for(int i = 1 ; i <= nr_cifre ; i++)
rez = 10 * rez + A[i];
return rez;
}
int p(int x)
{
int nr1 = 0;
while(x)
{
x /= 10;
nr1++;
}
return nr1;
}
int put(int x, int pow)
{
int rez = 1;
while(pow)
{
rez *= x;
pow--;
}
return rez;
}
bool bun()
{
int X = fa_numar(cf);
int nr = p(X);
if(nr >= K && A <= X && X <= B)
return 1;
return 0;
}
int cifra(int x, int poz)
{
return (x / put(10, p(x) - poz)) % put(10, poz - 1);
}
int numara()
{
int Min[KMAX] = {0}, Max[KMAX] = {0};
copy(cf + 1, cf + nr_cifre + 1, Min + 1);
copy(cf + 1, cf + nr_cifre + 1, Max + 1);
int nr_A = p(A);
for(int i = 1 ; i <= nr_cifre ; i++)
if(!cf[i])
if(i > nr_cifre - nr_A)
for(int k = 0 ; k <= 9 ; k++)
if(k != C && k >= cifra(A, i - (nr_cifre - nr_A)))
{
Min[i] = k;
break;
}
else
Min[i] = 0;
for(int i = 1 ; i <= nr_cifre ; i++)
if(!cf[i])
for(int k = 9 ; k ; k--)
if(k != C && k <= cifra(B, i))
{
Max[i] = k;
break;
}
int rez = 1;
for(int i = 1 ; i <= p(fa_numar(Min)) ; i++)
if(Min[i] < Max[i])
if(Min[i] <= C && C <= Max[i])
rez *= Max[i] - Min[i];
else
rez *= Max[i] - Min[i] + 1;
return rez;
}
void back(int k)
{
if(k == nr_cifre + 1)
{
if(bun())
REZ += numara();
return;
}
cf[k] = 0;
back(k + 1);
cf[k] = C;
back(k + 1);
}
void scrie()
{
printf("%.4lf\n", (double)REZ/(B - A + 1));
}
int main()
{
freopen("cifre.in", "r", stdin);
freopen("cifre.out", "w", stdout);
citire();
back(1);
scrie();
return 0;
}