Problema #3612 pbinfo
Un număr natural nenul se numește p-număr dacă are aceeași paritate cu suma divizorilor săi pozitivi. Exemplu: 10 și 25 sunt p-numere (10 are aceeași paritate cu 18=1+2+5+10, iar 25 are aceeași paritate cu 31=1+5+25).

Cerința
Subprogramul kpn, are trei parametri, a, b și k, în această ordine, prin care primește câte un număr natural din intervalul [1,105] (a≤b). Subprogramul returnează cel de al k-lea p-număr din intervalul [a,b] sau -1, dacă nu există cel puțin k astfel de numere în acest interval.

Scrieți definiția completă a subprogramului.




Exemplu
Dacă a=27, b=50 și k=3, atunci subprogramul returnează 34.

Răspuns :

int divizori(int n)

{

   int suma=0,i;

   for(i=1;i*i<=n;i++)

   {

       if(n%i==0)

       {

           suma+=i;

           if(i*i<n)

               suma+=n/i;

       }

   }

   return suma;

}

int pnumar(int p)

{

   if(divizori(p)%2==p%2) return 1;

   return 0;

}

int kpn(int a, int b, int k)

{

   for(int i=a;i<=b;i++)

       if(k)

           {

               if(pnumar(i))k--;

               if(k==0) return i;

           }

   return -1;

}