Witam,
Dostałem zadanie, w którym mam napisać program sprawdzający czy liczba podana z klawiatury jest doskonała. Jednakże kond, który napisałem nie dostał 100pkt, a jedynie 80. Powodem był najprawdopodobnie zbyt wysoki czas działania, bo zmienne mam w long long'u. Otwieram pytanie, ponieważ próbowałem użyć printf(), scanf(), (a nawet "\n" zamiast endl), ale żadna z tych zmian nie skutkowała lepszym wnikiem.
Oto zadanie:
Dane są liczby całkowite a, b oraz c. Wiemy, że a=b⋅ c. W takim wypadku a nazywamy wielokrotnością b oraz c, zaś b oraz c są dzielnikami właściwymi liczby a (przy założeniu, że b, c > 1). Liczba doskonała to liczba naturalna, która jest równa sumie wszystkich swoich dzielników właściwych. Dodatnia liczba całkowita jest niedoskonała, jeżeli suma jej dzielników właściwych jest mniejsza lub większa niż sama liczba. Tak więc suma dzielników 9 jest niedostateczna, a 12 jest za duża.
Dane
W pierwszym wierszu wejścia znajduje się jedna liczba całkowita bez znaku n (1 ≤ n ≤ 1000). W kolejnych n liniach znajduje się po jednej liczbie całkowitej x (4 ≤ x ≤ 109 ).
Wynik
Dla każdej podanej liczby x wypisz, czy jest ona doskonała („OK”), suma dzielników jest zbyt mała („NIEDOSTATECZNA”) lub za duża („WIELKA”).
Przykład
Dla danych wejściowych:
3
6 9 12
poprawną odpowiedzią jest:
OK
NIEDOSTATECZNA
WIELKA
Bardzo dziękuję za podsyłane przez Was odpowiedzi oraz komentarze na temat w jaki sposób uprościć/przyspieszyć działanie kodu.
Mój kod:
#include<bits/stdc++.h>
using namespace std;
long long dosk(long long y)
{
if(y==1) return 0;
long long suma=0;
//ide do pierwiastka z y, zeby mniej czasu zabieralo
for(int i=2; i*i<=y; i++)
{
if(y%i==0)
{
suma+=i;
if(y/i!=i)
{
suma+=y/i;
}
}
}
return suma+1;
}
int main()
{
int ile; cin>>ile;
long long y;
for(int i=1; i<=ile; i++)
{
cin>>y;
if(dosk(y)==y) cout<<"OK\n";
else if(dosk(y)>y) cout<<"WIELKA\n";
else cout<<"NIEDOSTATECZNA\n";
}
}
PS. Zrobiłem program działający na identycznej zasadzie, tylko, że void'em i dało mi 100pkt. Nie wiem czym może być to spowodowane.