Teil des Programms Ich habe überprüft, ob eine Eingabe-Nummer eine perfekte Nummer ist. Wir sollen eine Lösung finden, die in O (sqrt (n)) läuft. Der Rest meines Programms läuft in konstanter Zeit, aber diese Funktion hält mich zurück.Optimieren Sie eine Überprüfung der perfekten Nummer auf O (sqrt (n))
function Perfect(x: integer): boolean;
var
i: integer;
sum: integer=0;
begin
for i := 1 to x-1 do
if (x mod i = 0) then
sum := sum + i;
if sum = x then
exit(true)
else
exit(false);
end;
Dies läuft in O (n) Zeit, und ich brauche es auf O (sqrt (n)) Zeit zu verkürzen.
Dies sind die Optionen, die ich gekommen bin oben mit:
(1) Finden Sie einen Weg für die Schleife von 1 bis sqrt (x) gehen zu machen ...
(2) finden Möglichkeit, nach einer perfekten Nummer zu suchen, die keine For-Schleife verwendet ...
Irgendwelche Vorschläge? Ich schätze alle Hinweise, Tipps, Anweisungen usw. :)
Es gibt nur wenige (5 bekannt) vollkommene Zahlen in der ganzen Zahl Angebot. Stellen Sie sie einfach in ein konstantes Array. –
Der vorherige Kommentar war nicht ganz ernst, aber in der Tat haben Sie Recht: Sie müssen nur durch 1..sqrt (n) teilen. Der Rest kann gespiegelt werden. –
Es gibt nichts in den Zuweisungsregeln, das besagt, dass die Eingabe eine ganze Zahl sein muss, aber ich werde es versuchen. Vielen Dank. – Reccho