Informatică, întrebare adresată de vipilanac, 8 ani în urmă

Problema #3272 SumDivOgl

Cerința
Se dau n numere naturale. Determinați suma divizorilor oglinditelor celor n numere.

Date de intrare
Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spații.

Date de ieșire
Programul va afișa pe ecran numărul S, reprezentând suma cerută.

Restricții și precizări
1 ≤ n ≤ 1000
cele n numere citite vor fi mai mici decât 1.000.000.000

Exemplu
Intrare

3
12 23 30

Ieșire
99

Explicație
Oglinditul lui 12 este 21; suma divizorilor săi este 32. Oglinditul lui 23 este 32; suma divizorilor săi este 63. Oglinditul lui 30 este 3; suma divizorilor săi este 4.

Sursa mea de 80p:

#include
using namespace std;
int oglindit(int n)
{
int u,inv=0;
while(n)
{
u=n%10;
inv=inv*10+u;
n=n/10;
}
return inv;
}
int sumdiv(int n)
{
int d,s=0;
for(d=1; d*d if(n%d==0)
s=s+d+n/d;
if(d*d==n)
s=s+d;
return s;
}
long long n,i,v[1001],s=0;
int main()
{
cin>>n;
for(i=1; i<=n; i++)
{
cin>>v[i];
s=s+sumdiv(oglindit(v[i]));
}
cout< return 0;
}

Răspunsuri la întrebare

Răspuns de cosss96
11

Răspuns:

De ce ai pus long long pe nr, vector si i? Trebuie doar suma s-o scoata mare. Acolo depaseste int.

#include <iostream>

using namespace std;

int main() // complexitate O[n*sqrt(valmax)]

{

   int n, i, j, ogl = 0, nr, k;

   long long int S = 0;

   cin >> nr;

   for (k = 1; k <= nr; k++)

   {

       cin >> n; //citire numere

       ogl = 0; // reinitializare nr oglindit

       while (n != 0)   //oglindire

       {

           ogl = ogl * 10 + n % 10;

           n /= 10;

       }

       for (i = 1; i * i <= ogl; i++) //divizori

       {

           if (ogl % i == 0)

           {

               S += i;

               j = ogl / i;

               if (j != i)

                   S += j;

           }

       }

   }

   cout << S; //afisare suma

}

Explicație:

Alte întrebări interesante