实现思路
记被除数为 N N N,除数为 K K K, N N N 与 K K K 均为整数,则 N N N 除以 K K K 并向上取整的计算方案如下:
当 K K K 大于 0 时
- 若 N N N 为 0,则 ⌈ N K ⌉ = 0 \lceil \frac{N}{K} \rceil = 0 ⌈KN⌉=0
- 若 N N N 大于 0,则 ⌈ N K ⌉ = ⌊ N − 1 K ⌋ + 1 \lceil \frac{N}{K} \rceil = \lfloor \frac{N - 1}{K} \rfloor + 1 ⌈KN⌉=⌊KN−1⌋+1
- 若 N N N 小于0,则 ⌈ N K ⌉ = ⌊ N + 1 K ⌋ − 1 \lceil \frac{N}{K} \rceil = \lfloor \frac{N + 1}{K} \rfloor - 1 ⌈KN⌉=⌊KN+1⌋−1
当 K K K 等于 0 时,定义返回最大值
当 K K K 小于 0 时,由于 N K = N × ( − 1 ) K × ( − 1 ) \frac{N}{K} = \frac{N \times(-1) }{K \times (-1) } KN=K×(−1)N×(−1),可将 K K K 的负号转移至 N N N,然后按照以上方案进行类似处理
基于不同的需求,可针对除数为 0 的情况做不同的处理。此处规定:无论被除数为多少,只要 K K K 为 0,则返回正数最大值。
代码实现
代码实现:
#include <limits.h>
int round_up(int dividend, int divisor)
{
int result = 0;
char dividend_sign = 0;
char divisor_sign = 0;
if (divisor == 0)
{
return INT_MAX;
}
dividend_sign = (dividend > 0) ? (1) : (-1);
divisor_sign = (divisor > 0) ? (1) : (-1);
if (dividend == 0)
{
result = 0;
}
else if (dividend_sign * divisor_sign > 0)
{
result = ((dividend * dividend_sign) - 1) / (divisor * divisor_sign) + 1;
}
else
{
result = ((dividend * divisor_sign) + 1) / (divisor * divisor_sign) - 1;
}
return result;
}
测试样例
测试代码:
#include <stdlib.h>
#include <stdio.h>
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
#endif
int main(void)
{
int dividends[] = {-6, -3, -2, -1, 0, 1, 2, 3, 6};
int divisors[] = {2, 0, -2};
int i = 0;
int j = 0;
for (i = 0; i < ARRAY_SIZE(divisors); ++i)
{
for (j = 0; j < ARRAY_SIZE(dividends); ++j)
{
printf("ROUNDUP(%d/%d)=%d\n", dividends[j], divisors[i], round_up(dividends[j], divisors[i]));
}
printf("\n");
}
return 0;
}
运行结果:
ROUNDUP(-6/2)=-3
ROUNDUP(-3/2)=-2
ROUNDUP(-2/2)=-1
ROUNDUP(-1/2)=-1
ROUNDUP(0/2)=0
ROUNDUP(1/2)=1
ROUNDUP(2/2)=1
ROUNDUP(3/2)=2
ROUNDUP(6/2)=3
ROUNDUP(-6/0)=2147483647
ROUNDUP(-3/0)=2147483647
ROUNDUP(-2/0)=2147483647
ROUNDUP(-1/0)=2147483647
ROUNDUP(0/0)=2147483647
ROUNDUP(1/0)=2147483647
ROUNDUP(2/0)=2147483647
ROUNDUP(3/0)=2147483647
ROUNDUP(6/0)=2147483647
ROUNDUP(-6/-2)=3
ROUNDUP(-3/-2)=2
ROUNDUP(-2/-2)=1
ROUNDUP(-1/-2)=1
ROUNDUP(0/-2)=0
ROUNDUP(1/-2)=-1
ROUNDUP(2/-2)=-1
ROUNDUP(3/-2)=-2
ROUNDUP(6/-2)=-3