#include <cmath> #include <iostream> #include <iomanip> #include <limits.h> int idiv_ceil ( int numerator, int denominator ) { int truncated = numerator / denominator; return truncated + (((numerator < 0) ^ (denominator > 0)) && (numerator - truncated*denominator)); } void test( int n, int d ) { int using_float = (int) std::ceil( (double)n / d ); int using_fn = idiv_ceil(n, d); std::cout << std::setw(15) << n << std::setw( 5) << d << std::setw(15) << using_float << std::setw(15) << using_fn << std::setw( 8) << ((using_float == using_fn)? "ok" : "ERROR") << std::endl; } int main(void) { test(INT_MAX, 1); test(-INT_MAX, 1); test(INT_MIN, 1); for( int n = -5; n < 5; n++ ) { for ( int d = 1; d < 5; d++ ) { test(n, d); test(n, -d); } } }
Standard input is empty
2147483647 1 2147483647 2147483647 ok
-2147483647 1 -2147483647 -2147483647 ok
-2147483648 1 -2147483648 -2147483648 ok
-5 1 -5 -5 ok
-5 -1 5 5 ok
-5 2 -2 -2 ok
-5 -2 3 3 ok
-5 3 -1 -1 ok
-5 -3 2 2 ok
-5 4 -1 -1 ok
-5 -4 2 2 ok
-4 1 -4 -4 ok
-4 -1 4 4 ok
-4 2 -2 -2 ok
-4 -2 2 2 ok
-4 3 -1 -1 ok
-4 -3 2 2 ok
-4 4 -1 -1 ok
-4 -4 1 1 ok
-3 1 -3 -3 ok
-3 -1 3 3 ok
-3 2 -1 -1 ok
-3 -2 2 2 ok
-3 3 -1 -1 ok
-3 -3 1 1 ok
-3 4 0 0 ok
-3 -4 1 1 ok
-2 1 -2 -2 ok
-2 -1 2 2 ok
-2 2 -1 -1 ok
-2 -2 1 1 ok
-2 3 0 0 ok
-2 -3 1 1 ok
-2 4 0 0 ok
-2 -4 1 1 ok
-1 1 -1 -1 ok
-1 -1 1 1 ok
-1 2 0 0 ok
-1 -2 1 1 ok
-1 3 0 0 ok
-1 -3 1 1 ok
-1 4 0 0 ok
-1 -4 1 1 ok
0 1 0 0 ok
0 -1 0 0 ok
0 2 0 0 ok
0 -2 0 0 ok
0 3 0 0 ok
0 -3 0 0 ok
0 4 0 0 ok
0 -4 0 0 ok
1 1 1 1 ok
1 -1 -1 -1 ok
1 2 1 1 ok
1 -2 0 0 ok
1 3 1 1 ok
1 -3 0 0 ok
1 4 1 1 ok
1 -4 0 0 ok
2 1 2 2 ok
2 -1 -2 -2 ok
2 2 1 1 ok
2 -2 -1 -1 ok
2 3 1 1 ok
2 -3 0 0 ok
2 4 1 1 ok
2 -4 0 0 ok
3 1 3 3 ok
3 -1 -3 -3 ok
3 2 2 2 ok
3 -2 -1 -1 ok
3 3 1 1 ok
3 -3 -1 -1 ok
3 4 1 1 ok
3 -4 0 0 ok
4 1 4 4 ok
4 -1 -4 -4 ok
4 2 2 2 ok
4 -2 -2 -2 ok
4 3 2 2 ok
4 -3 -1 -1 ok
4 4 1 1 ok
4 -4 -1 -1 ok