#include <stdio.h>

/*condition en b
    la somme des nombres egale 19
FsumNUM(N) donne la somme des nombres dans N
*/
//numérologie , (somme des unité en M) == N
//FsumNUM(N) => N mod 10 + FsumNUM(N/10)
//FsumNUM(0) => 0
int sumnum(int n)
{
    return n==0?    0:  n%10+sumnum(n/10);
}

/*condition C i
    le chffre 9 apparait au moin une fois
Fhave(M,N) donne 1 si N a apparait dans M
*/
//il y a au moin N dans la décomposition numérologique de M
//Fhave(M,N) => ((M mod 10 = N ) + Fhave(M/10)
//Fhave(0,N) => (0)
int have(int m, int n)
{
    return m==0?    0:  m%10==n | have(m/10,n);
}

//avoir le chiffre à la position N
//Fget(M,N) => Fget(M/10,N-1)
//Fget(M,0) => M%10
//Fget(0,N) => 0
//Fget(0,N) => 0
int get(int m, int n)
{
    return  m==0?   0:  (n==0?  m%10:   get(m/10,n-1));
}

/*condition C ii
    le chiffre à la position des dizaine et centaine sont egal
Fposequ(M,N,K) retourne 1 si le chiffre à la position n est egal 
à celui de la position K dans M
0 => unité
1 => dizaine
2 => centaine
...
condition C iii est couverte par cette fonction
*/
//le chiffre à la position N est égale à la position K
//Fposequ(M,N,K) => Fget(M,1)==Fget(M,2)
int posequ(int m, int n, int k)
{
    return (get(m,n) == get(m,k));
}

/*
toute condition réuni
*/
//toute condition réuni
//Fcondition(M) => FsumNUM(M)==19 and Fhave(M,9) and Fposequ(M,1,2) and Fposequ(4,5)
int condition(int M)
{
    return sumnum(M)==19 & have(M,9) & posequ(M,1,2) & posequ(M,4,5);
}

/*
trouver parmi les nombre inférieur à M, tout les nombres qui entre dans la condition

*/
//pour tout les nombre inférieur ou égal à N
//Fpourcond(M) => Fcondition(M) + Fpourcond(M-1)
//Fpourcond(0) => 0
int pourcond(int M)
{
    int n = 0,
        i;
    for (i=0;i<M;i++)
        if (condition(i))
        {
            printf("%d\n", i);
            n++;
        }
    return n;
}


int main()
{
    printf("\n");
    printf("nombre trouve=%d\n",pourcond(1000000));

    return 0;
}
