Cod sursa(job #1174944)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 24 aprilie 2014 11:24:49
Problema Cifre Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
using namespace std;
#include <fstream>
#include <iomanip>
ifstream fin("cifre.in");
ofstream fout("cifre.out");

int nrn=0, c, k;
int a[12], b[12], nr[12];

int cmp(int*, int*) ;
void bkt(int) ;
void afiseaza() ;


int main()
{
    int a1, b1, a2, b2;
    fin>>a1>>b1>>c>>k; a2=a1; b2=b1;
    while(a1) a[++a[0]]=a1%10, a1/=10;
    while(b1) b[++b[0]]=b1%10, b1/=10;
    bkt(1);
    fout<<setprecision(4)<<1.0*nrn/(b2-a2+1);
    return 0;
}


int cmp(int v1[], int v2[])
{                           //1 daca v1<v2 ;  -1 daca v1>v2
    if(v1[0]<v2[0]) return 1;
    if(v1[0]>v2[0]) return -1;
    for(int i=v1[0]; i>=1; --i)
    {
        if(v1[i]<v2[i]) return 1;
        if(v1[i]>v2[i]) return -1;
    }
    return 0;
}

void bkt(int nrc)
{       //pozitiile de la 1 la nrc-1 sunt ocupate
    afiseaza();
    if(nrc<=b[0])
    {
        int i;
        for(i=0; i<=9; ++i)
        {
            nr[nrc]=i;
            nr[0]++;
            bkt(nrc+1);
            nr[nr[0]]=0;
            nr[0]--;
        }
    }
}

void afiseaza()
{
    if(nr[nr[0]]==0) return;
    if(cmp(a, nr)==-1) return;
    if(cmp(nr, b)==-1) return;
    int i, cf=0;
    for(i=1; i<=nr[0]; ++i)
        if(nr[i]==c) cf++;
    if(cf>=k)
    {
        nrn++;
        /*for(i=nr[0]; i>=1; --i)
            fout<<nr[i];
        fout<<'\n';*/
    }
}