C语言中“1A剧院广场”的代码求解

C语言中“1A剧院广场”的代码求解,c,math,format-specifiers,C,Math,Format Specifiers,这里的新手程序员试图提高C语言水平,所以我开始在一个名为codeforces的网站上解决代码问题。然而,我似乎被卡住了,我写的代码在实践中似乎是可行的,但网站并不认为它是正确的 问题是: 首都柏林的剧院广场呈长方形,大小为n × 米。在该市的周年纪念日之际,决定用方形花岗岩石板铺设广场。每块石板的大小都是a × A.铺设广场最少需要多少块石板?允许覆盖比剧院广场大的表面,但广场必须被覆盖。不允许打碎石板。石板的侧面应与广场的侧面平行 资料来源: 我确实很难完全理解这个问题背后的数学原理,我使用了

这里的新手程序员试图提高C语言水平,所以我开始在一个名为codeforces的网站上解决代码问题。然而,我似乎被卡住了,我写的代码在实践中似乎是可行的,但网站并不认为它是正确的

问题是:


首都柏林的剧院广场呈长方形,大小为n × 米。在该市的周年纪念日之际,决定用方形花岗岩石板铺设广场。每块石板的大小都是a × A.铺设广场最少需要多少块石板?允许覆盖比剧院广场大的表面,但广场必须被覆盖。不允许打碎石板。石板的侧面应与广场的侧面平行

资料来源:

我确实很难完全理解这个问题背后的数学原理,我使用了这个来源的用户Joshua Pan的答案来更好地理解这个问题

资料来源:

这是我的代码:

#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 theatersquare.c-lm编译了它

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

提前感谢。

典型的双IEEE754 64位浮点没有足够的精度解决此问题

例如,输入

999999999 999999999 1
您的程序可能会给出输出

999999998000000000
而实际的答案是

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

对于此计算,可以添加include并使用64位整数类型int64\t

%SCNd64用于读取,%PRId64用于写入int64\t

整数上的celln/a可以通过n+a-1/a来完成。

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

例如,输入

999999999 999999999 1
您的程序可能会给出输出

999999998000000000
而实际的答案是

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

对于此计算,可以添加include并使用64位整数类型int64\t

%SCNd64用于读取,%PRId64用于写入int64\t


整数上的celln/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;
}
编辑:

上面描述的问题是由于我运行的是64位机器,而在线编译器可能使用的是32位。无符号长变量溢出

以下代码将通过所有测试

#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;
}

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

#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;
}
编辑:

上面描述的问题是由于我运行的是64位机器,而在线编译器可能使用的是32位。无符号长变量溢出

以下代码将通过所有测试

#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

首都柏林的剧院广场呈长方形,大小为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))

您可以尝试以下操作:

import math

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

使用下面的代码,它将通过我们需要使用long-long-for-all变量声明来获得输出的所有测试用例

#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;
}

使用下面的代码,它将通过我们需要使用long-long-for-all变量声明来获得输出的所有测试用例

#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;
}

原始问题描述中指定了a,n,m@EOF,输入为真,但输出为假,因为n/a*m/a可以大于10^10。@Mikeca请原谅我的提问,但我对这一切还是新手。是一个库,int64_t是来自所述库的数据类型。但我仍然很难理解如何正确使用SCNd64和PRId64。我在网上查过,但还不清楚。scanf%PRId64,&n,&a?它将类似于scanf%SCNd64,&n@mrStap:不是图书馆。它是一个头文件。头文件通常用于声明内容。基本上,它们只是包含信息或编译器的源代码。有时它们声明库中的例程。但是实际的例程在不同的文件中,链接程序时必须包含这些文件。但是仅仅声明类型的名称和一些宏来帮助使用这些类型。因此,它只是一个没有关联库的源代码文件。原始问题描述指定a,n,m@EOF输入为真,但输出为假,因为n/a*m/a可能大于10^10。@MikeCAT请原谅我的提问,但我对所有这一切都还不熟悉。是一个库,int64_t是来自所述库的数据类型。但我仍然很难理解如何正确使用SCNd64和PRId64 . 我在网上查过,但还不清楚。scanf%PRId64,&n,&a?它将类似于scanf%SCNd64,&n@mrStap:不是图书馆。它是一个头文件。头文件通常用于声明内容。基本上,它们只是包含信息或编译器的源代码。有时它们声明库中的例程。但是实际的例程在不同的文件中,链接程序时必须包含这些文件。但是仅仅声明类型的名称和一些宏来帮助使用这些类型。所以它只是一个没有关联库的源代码文件。