在 C 中解决代码力“1A Theatre Square”

Solving code-forces "1A Theatre Square" in C

这里的新手程序员试图在 C 方面做得更好,所以我开始在一个名为 codeforces 的网站上做代码问题。但是我似乎被卡住了,我编写的代码似乎在实践中有效,但网站不接受它是正确的。

问题:

首都贝尔兰的剧院广场呈n⟩×⟩米长方形。在城市周年之际,决定用方形花岗岩石板铺设广场。每块石板的大小为 a⟩×⟩a。铺广场最少需要多少块石板?允许覆盖比剧院广场大的表面,但必须覆盖广场。不允许打破石板。石板的边应与广场的边平行。1

来源:

https://codeforces.com/problemset/problem/1/A

我确实很难完全理解问题背后的数学原理,并使用了来自名为“Joshua Pan”的用户的回答来更好地理解问题

来源:

https://www.quora.com/How-do-I-solve-the-problem-Theatre-Square-on-Codeforces

这是我的代码:

#include<stdio.h>
#include<math.h>

int main(void)
{
    double n,m,a;
    scanf("%lf %lf %lf", &n,&m,&a);
    printf("%1.lf\n", ceil(n/a)*ceil(m/a));

    return 0;
}

我使用“gcc TheatreSquare.c -lm”编译它

当给定示例输入 6、6、4 时,我的代码生成正确的输出 4,但是网站不接受此代码是正确的,我可能是错的,但也许我使用的格式说明符不正确?

提前致谢。

典型的 double(IEEE754 64 位浮点)没有足够的精度来解决这个问题。

例如,对于输入

999999999 999999999 1

你的程序可能会给出输出

999999998000000000

而实际答案是

999999998000000001

为避免这种情况,您不应使用浮点数据类型。

您可以添加 #include <inttypes.h> 并使用 64 位整数类型 int64_t 进行此计算。

"%" SCNd64 用于读取,"%" PRId64 用于写入 int64_t

cell(n/a) 整数可以通过 (n + a - 1) / a.

完成

你可以用整数来解决这个问题。

#include <stdio.h>

int main()
{
    unsigned long n, m, a = 1;
    unsigned long na, ma, res = 0;
    
    scanf("%lu %lu %lu", &n, &m, &a);
    
    na = n/a;

    if (n%a != 0)
        na++;
    
    ma = m/a;

    if (m%a != 0)
        ma++;

    res = na * ma;

    printf("%lu", res);

    return 0;
}

此代码将在 Codeforce 平台的测试 9 中失败(见下文)。但是如果你编译它并且运行它在本地使用相同的输入,结果是正确的。

> Test: #9, time: 15 ms., memory: 3608 KB, exit code: 0, checker exit code: 1, verdict: WRONG_ANSWER
> Input 1000000000 1000000000 1
> Output 2808348672 Answer 1000000000000000000
> Checker Log wrong answer 1st numbers differ - expected: '1000000000000000000', found: '2808348672'

编辑:

出现上述问题是因为我运行正在使用 64 位机器,而在线编译器可能使用的是 32 位机器。 unsigned long 变量溢出。

以下代码将通过所有测试。

#include <stdio.h>

int main()
{
    unsigned long long n, m, a = 1;
    unsigned long long na, ma, res = 0;
    
    scanf("%llu %llu %llu", &n, &m, &a);
    
    na = n/a;

    if (n%a != 0)
        na++;
    
    ma = m/a;

    if (m%a != 0)
        ma++;

    res = na * ma;

    printf("%llu", res);

    return 0;
}

首都贝尔兰的剧院广场呈n⟩×⟩米长方形。在城市周年之际,决定用方形花岗岩石板铺设广场。每块石板的大小为a × a.

import java.util.Scanner;

public class theatre_square {


    public static void main(String[] args) {
        long a,b,c;
        Scanner s = new Scanner(System.in);
        a = s.nextLong();
        b = s.nextLong();
        c = s.nextLong();
        long result = 0;
        if(a>=c){
            if(a%c==0) 
            result = a/c;
            else
            result = a/c + 1; // some part is left
        }else{ // area of rectangle < area of square then 1 square is required
            result = 1;
        }
        if(b>=c){
            if(b%c==0)
            result *= b/c;
            else
            result *= b/c + 1;
        }
        System.out.println(result);

    }
}




 case 1 .  2 2 3 => 1
          length = 2 so 2 < 3 then only 1 square required <br>
          breadth = 2 so 2 < 3 then covered in previous square so output 1
          
              intial view 
               
              0 0
              0 0

             after adding 1 square ( r= remaining or left)
      
              1 1 r
              1 1 r
              r r r

case 2 .  6 6 4  => 4
          length = 2 so 6 > 4 then only 2 square required <br>
          breadth = 2 so 6 > 4 then 2 square required 
          
              intial view 
               
              0 0 0 0 0 0
              0 0 0 0 0 0
              0 0 0 0 0 0
              0 0 0 0 0 0
              0 0 0 0 0 0
              0 0 0 0 0 0


             after adding 4 square ( r= remaining or left)
      
              1 1 1 1 2 2 r r
              1 1 1 1 2 2 r r
              1 1 1 1 2 2 r r
              1 1 1 1 2 2 r r
              3 3 3 3 4 4 r r
              3 3 3 3 4 4 r r
              r r r r r r r r
              r r r r r r r r

您可以尝试以下方法:

import math

x,y,z=list(map(float, input().split()))  
print(math.ceil(x/z)*math.ceil(y/z))

使用下面的代码将通过我们需要的所有测试用例,所有变量声明都使用long long来获取输出。

#include <stdio.h>
#include <math.h>
int main(){
    long long n,m,a,l,b;
    scanf("%lld%lld%lld",&n,&m,&a);
    l= n/a;
    if(n%a != 0)
    l++;
    b= m/a;
    if(m%a != 0)
    b++;
    printf("%lld",l*b);
    return 0;
}