首页 > 解决方案 > 长方体中的立方体

问题描述

大家好,

我需要一个 C 程序来计算最小长方体的数量ABC容纳N边长为 的立方体S,其中1 <= N <= pow(10, 9), 1 <= S <= min(A, B, C), 1 <= A, B, C <= 1000。我做了以下事情:

#include <stdio.h>

int main() {
    unsigned long long int cubenum, length, boxnum, a, b, c, cpb;
    
    scanf("%llu %llu %llu %llu %llu", &cubenum, &length, &a, &b, &c); getchar();
    
    // how many cubes per box?
    cpb = a/length * b/length * c/length;
    
    // how many boxes given the amount of cubes?
    boxnum = (cubenum + (cpb - 1)) / cpb;
    
    printf("%llu\n", boxnum);
    
    return 0;
}

给出了以下测试用例:

testcase #1
stdin: 24 4 8 8 8
stdout: 3

testcase #2
stdin: 27 3 8 4 10
stdout: 5

我自己添加了以下测试用例:

testcase #3
stdin: 1 1 1 1 1
stdout: 1

testcase #4
stdin: 1000000000 500 999 999 999
stdout: 1000000000

testcase #5
stdin: 1000000000 499 999 999 999
stdout: 125000000

testcase #6
stdin: 1000000000 2 999 999 999
stdout: 9

我用 Clang 版本 10.0.0-4ubuntu1 编译。给定的测试用例在我的设备上正确通过,而我自己添加的测试用例在手动进行数学运算时似乎是正确的,但是在提交时我的程序被声明为“错误”。不幸的是,没有关于失败的地点、原因或方式的任何反馈。陪审团使用的编译器是未知的,但我过去的经验告诉我它很可能运行 Linux(我尝试使用 Windows 特定的库函数)。因此,我想知道,是否有任何测试用例导致我的代码失败但我没有发现?还是我有其他疏忽?

感谢您的时间。


附带问题:

我怀疑我弄错的部分在这里:

boxnum = (cubenum + (cpb - 1)) / cpb;

我尝试过使用ceil()in math.h,但使用double演员表感觉真的很hacky,然后回到unsigned long long int,但它确实适用于所有测试用例。我不得不用clang -lm main.c -o main而不是编译clang main.c -o main,但它确实运行了。难道陪审团有一个修改后的math.h库?在另一个程序上,我使用了sqrt()andpow()并且它们都被认为是正确的,这告诉我问题不是我怀疑的问题,或者陪审团确实有一个修改后的math.h库。或者它可能是别的东西?

标签: cclang

解决方案


线

cpb = a/length * b/length * c/length;

是错误的,因为这个表达式是从左到右计算的,截断可能不适用于band c

例如,使用此输入

15 10 100 10 19

该公式将计算如下

  a/length * b/length * c/length
= 100/10 * 10/10 * 19/10
= 10 * 10 / 10 * 19 / 10
= 100 / 10 * 19 / 10
= 10 * 19 / 10
= 190 / 10
= 19

因此,您的程序将输出1因为所需的 15 个立方体可以被 19 个立方体覆盖,而正确的输出是2因为实际上只能从一个盒子中创建 10 个立方体。

尝试这个:

cpb = (a/length) * (b/length) * (c/length);

推荐阅读