Schneller Weg, um das nächste Vielfache einer Zahl zu finden

8

Ich muss das erste Vielfache für eine Zahl finden, die von einer Basisnummer ausgeht. Zum Beispiel: Das erste Vielfache von 3 von 7 ist 9. Mein erster Versuch war, dies zu tun:

%Vor%

Am Ende wird "multiple" das erste Vielfache von number nach baseNumber haben. Das Problem ist, dass wenn number zu groß wird, die Anzahl der Iterationen zu groß wird. Meine Frage ist also: Gibt es einen schnelleren Weg, dies zu tun?

    
LuisEspinoza 27.07.2012, 17:38
quelle

4 Antworten

19

Wenn alles positiv ist, versuchen Sie

%Vor%

Das macht es in konstanter Zeit.

Zuerst fügen wir number - 1 hinzu, um sicherzustellen, dass wir eine Zahl haben, die mindestens so groß ist wie das nächste Vielfache, aber kleiner als die nächste Zahl. Dann subtrahieren wir den Rest der Division um number , um sicherzustellen, dass wir das gewünschte Vielfache haben.

Wenn baseNumber negativ sein kann (aber number immer noch positiv), haben wir das Problem, dass multiple % number möglicherweise negativ ist, wenn multiple < 0 , also könnte das obige ein Vielfaches von number überspringen. Um dies zu vermeiden, können wir z. B.

verwenden %Vor%

Wenn die Verzweigung zu teuer ist, können wir das if auf Kosten von zwei Divisionen vermeiden, anstatt eines,

%Vor%

Im Allgemeinen scheint if jedoch vorzuziehen.

Wenn number negativ sein kann, ersetzen Sie es zuerst durch seinen absoluten Wert.

Hinweis: Das obige gibt, wie der ursprüngliche Code, baseNumber zurück, wenn das bereits ein Vielfaches von number ist. Wenn das nicht erwünscht ist, entferne - 1 in der ersten Zeile.

    
Daniel Fischer 27.07.2012, 17:43
quelle
4

probiere das (Erfordert INTEGER-Division):

%Vor%

7/3 = 2. 3 * (2 + 1) = 9.

Sie haben einen Kantenfall, bei dem baseNumber bereits ein Vielfaches von number ist, was Sie mit der Modulo-Operation testen müssen.

    
Chris Cudmore 27.07.2012 17:45
quelle
3

Warum brauchen Sie eine Schleife?

multiple = (floor (Nummer / baseNumber) +1) * baseNumber

    
bigbenbt 27.07.2012 18:09
quelle
0
%Vor%

Also für baseNumber = 3, Nummer = 7, Ihr Vielfaches ist 3;

obwohl etwas sagt mir Bignums sind im Begriff, hier zu zeigen.

    
Shark 27.07.2012 17:44
quelle

Tags und Links