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

Ce trebuie sa modific la un program pentru care se depaseste limita de timp? (urgent)


rossetta: despre ce este vorba?
rossetta: ma intereseaza cerinta si codul
rossetta: ca sa pot sa te ajut
dianaaaaa00: problema este: Se citește un număr natural n. Să se determine suma divizorilor impari ai săi.#include<iostream>
using namespace std;
int main()
{ long long n,d,s=0;
cin>>n;
for(d=1;d<=n/2;d++)
if(n%d==0 && d%2!=0)
s+=d;
cout<<s;
return 0;}
rossetta: programul se poate optiniza mergând pana la radical din n - 1 si tratand separat cazul in care n e patrat perfect
rossetta: vrei sa iti scriu codul?

Răspunsuri la întrebare

Răspuns de rossetta
2
#include using namespace std; int main() { long long n, d, s = 0; cin >> n; for(d = 1; d * d < n; d = d + 2) if(n % d == 0) s += d; if(d * d == n) s +=d; cout << s; return 0; } O alta optimare pe care am făcut-o a fost sa merg cu d din 2 in 2

rossetta: #include <iostream >
using namespace std;
int main() {
long long n, d, s = 0;
cin &gt;&gt; n;
for(d = 1; d * d &lt; n; d = d + 2)
if(n % d == 0)
s += d;
if(d * d == n)
s +=d;
cout &lt;&lt; s;
return 0;
}

O alta optimare pe care am făcut-o a fost sa merg cu d din 2 in 2
rossetta: a modificat site-ul la cin si cout, a adăugat niste & &
rossetta: poti sa le ignori
rossetta: am făcut niște modificări
rossetta: #include<iostream>
using namespace std;
int main()
{

long long n, d, s = 0;
cin >> n;
for(d = 1;d * d < n;d++)
if(n % d == 0) {
if(d % 2 != 0)
s += d;
if(n / d % 2 != 0)
s += n / d;
}
if(d * d == n)
s += d;
cout << s;
return 0;
}
rossetta: acesta este programul corect. aseară imi era somn și nu am fost atenta la următoarele aspecte : (1) daca mergi pana la radicalul numărului trebuie sa te bazezi pe faptul ca divizorii sunt perechi si daca ai gasit un divizor poti sa ii găsești perechea impartind n la divizorul respectiv; (2) daca încerci potențialii divizori din 2 in doi, atunci contează paritatea lui n (am preferat sa nu mai pun if - uri si sa merg din 1 in 1 pt ca programul este oricum rapid)
dianaaaaa00: am inteles, multumesc mult :))
Alte întrebări interesante