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 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: