2016-04-12 13 views
1

Я пытаюсь создать функцию int smallestDivisibleAfter(int number, int divisor) так, чтобы она возвращала наименьшее число, большее или равное number, которое делится на divisor (что отличает ноль). Здесь все входы и выходы считаются неотрицательными.Как округлить число до нескольких цифр?

Примеры:

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

я придумал с кодом number + divisor - number % divisor. Однако это перестает работать, когда number % divisor == 0, с тех пор smallestDivisibleAfter(16,2); // Returns 18 вместо 16.

Кроме того, number - 1 + divisor - (number - 1)% divisor не работает, поскольку int будет заменен на unsigned long long, когда я введу этот код в действие.

Какое здесь самое лучшее решение?

+0

'divisor * ((число/делитель) + (число% divisor? 1: 0))'? – m69

+3

'(number + divisor - 1)/divisor * divisor'? – AlexD

+0

Ваш вопрос не соответствует вашему примеру - 18 - это «наименьшее число, большее 16, которое делится на 2», а 16 - нет. –

ответ

1

Если вы хотите, чтобы избежать скачков, попробуйте:

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

!!x просто преобразует число в булево с 0, если x==0 и 1 в противном случае.

+0

Вы уверены, что на уровне сборки, что '!!' может сделать это без ветки? –

+0

@MarkB Если мы говорим о x86, это будет простой setnz. Я что-то упустил? –

+0

А вообще-то, я просто не уверен, что с сборкой x86. –

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

Это вернет следующий наибольший кратный делитель после номера.

Если вы планируете использовать поплавки: floor(number/divisor).

+0

Целочисленное деление не приводит к поплавке; нечего делать(). – m69

+1

Небольшое предложение: лучше получить уверенность в своем ответе перед публикацией. Цель ответа заключается не в том, чтобы как можно скорее угадать правильный ответ, это обеспечить правильный и убедительный ответ, который другие люди могут читать и понимать. –

+0

Да, я только что отредактировал это, изначально я не потрудился с полом, а затем добавил его в casehe решает использовать поплавки – user6190774

 Смежные вопросы

  • Нет связанных вопросов^_^