用正方形填充M x N矩形,边长为2 ^ K,2 ^(K - 1),...,4,2,1

时间:2014-11-22 21:27:06

标签: c algorithm recursion

我们得到一个 M x N 矩形,并要求用长度 2 ^ K,2 ^(K - 1),...,4的边长方形填充它2,1 。我们首先填充 2 ^ K (尽可能多),然后使用 2 ^(K - 1),依此类推。我们总共需要多少个方格?

我写了以下递归代码:

#include <stdio.h>
#include <stdlib.h>

long long_pow(long base, long exponent)
{
    if (!exponent)
        return 1L;

    return base * long_pow(base, exponent - 1L);
}

long cover(long width, long height, long side)
{
    if (width <= 0L || height <= 0L)
        return 0L;

    long full_width = width / side;   // The full width we can cover.
    long full_height = height / side; // The full height we can cover.

    return (full_width * full_height) // The full area we can cover
                                      // plus the rest (recursively).
           + cover(width - full_width * side, height, side / 2L)
           + cover(full_width * side, height - full_height * side, side / 2L);
}

int main()
{
    long width, height, k;
    scanf("%ld %ld %ld", &width, &height, &k);
    printf("%ld\n", cover(width, height, long_pow(2L, k)));
    return 0;
}

此代码在我给出的10个测试用例中的1个上失败。即,在123456789 987654321 4上,它会输出1690311532而不是476300678536044。但是,在123456789 987654321 30上,它会输出1437797319的正确结果。其他测试用例也很有效。

问题出在哪里?

1 个答案:

答案 0 :(得分:1)

代码的唯一问题是long溢出。我改为使用unit64_t