La respuesta de Sparky es una forma estándar de resolver este problema, pero como también escribí en mi comentario, corre el riesgo de desbordamientos. Esto se puede resolver utilizando un tipo más amplio, pero ¿qué pasa si desea dividir long long
s?
La respuesta de Nathan Ernst proporciona una solución, pero implica una llamada a la función, una declaración de variable y un condicional, lo que lo hace no más corto que el código OP y probablemente aún más lento, porque es más difícil de optimizar.
Mi solución es esta:
q = (x % y) ? x / y + 1 : x / y;
Será un poco más rápido que el código OP, porque el módulo y la división se realizan utilizando la misma instrucción en el procesador, porque el compilador puede ver que son equivalentes. Al menos gcc 4.4.1 realiza esta optimización con el indicador -O2 en x86.
En teoría, el compilador podría incluir la llamada de función en el código de Nathan Ernst y emitir lo mismo, pero gcc no hizo eso cuando lo probé. Esto podría deberse a que vincularía el código compilado a una única versión de la biblioteca estándar.
Como nota final, nada de esto importa en una máquina moderna, excepto si está en un circuito extremadamente cerrado y todos sus datos están en registros o en el caché L1. De lo contrario, todas estas soluciones serán igualmente rápidas, excepto posiblemente la de Nathan Ernst, que podría ser significativamente más lenta si la función tiene que ser obtenida de la memoria principal.
q = x/y + (x % y != 0);
es suficiente