2016-04-12 18 views
1

Ich versuche, eine Funktion int smallestDivisibleAfter(int number, int divisor) so zu entwerfen, dass es die kleinste Zahl größer als oder gleich number zurückgibt, die durch divisor teilbar ist (die nicht Null ist). Hier wird angenommen, dass alle Eingaben und Ausgaben nicht negativ sind.Wie wird eine Nummer zu einem Vielfachen einer anderen Nummer aufgerundet?

Beispiele:

smallestDivisibleAfter(9,4); // Returns 12 
smallestDivisibleAfter(16,2); // Returns 16 

kam ich number + divisor - number % divisor mit dem Code auf. Dies hört jedoch auf zu funktionieren, wenn number % divisor == 0, seitdem smallestDivisibleAfter(16,2); // Returns 18 anstelle von 16.

Außerdem funktioniert number - 1 + divisor - (number - 1)% divisor nicht, da int durch unsigned long long ersetzt wird, wenn ich diesen Code in die Tat umsetzen.

Was ist die beste Lösung hier?

+0

'Teiler * ((Zahl/Teiler) + (Zahl% Divisor? 1: 0))'? – m69

+3

'(Zahl + Divisor - 1)/Divisor * Divisor'? – AlexD

+0

Ihre Frage stimmt nicht mit Ihrem Beispiel überein - 18 ist die "kleinste Zahl größer als 16, die durch 2 teilbar ist" und 16 nicht. –

Antwort

1

Wenn Sie Sprünge zu vermeiden, versuchen Sie:

number - number % divisor + divisor * !!(number % divisor) 

Die !!x wandelt nur die Zahl in einen boolean mit 0, wenn x==0 und 1 sonst.

+0

Sind Sie auf der Assembly-Ebene sicher, dass '!!' das ohne eine Verzweigung tun kann? –

+0

@MarkB Wenn wir über x86 sprechen, wäre das eine einfache Entscheidung. Fehle ich hier etwas? –

+0

Ah überhaupt nicht, ich bin gerade nicht so flüssig mit x86-Assembly. –

-2
((number/divisor) + 1) * divisor) 

Dies wird das nächste größte Vielfache von Divisor nach Zahl zurückgeben.

Wenn Sie jemals planen, Floats zu verwenden: floor(number/divisor).

+0

Integer Division führt nicht zu einem Float; Es gibt nichts zu Boden(). – m69

+1

Ein kleiner Vorschlag: Es ist besser, vor der Veröffentlichung Vertrauen in Ihre Antwort zu gewinnen. Das Ziel der Beantwortung ist nicht so schnell wie möglich die richtige Antwort zu erraten, es ist eine korrekte und überzeugende Antwort, die andere Leute lesen und verstehen können. –

+0

Ja, ich habe gerade das bearbeitet, ursprünglich habe ich mich nicht mehr mit dem Boden beschäftigt, dann habe ich es hinzugefügt, wenn er entscheidet, Floats zu benutzen – user6190774