C语言中“1A剧院广场”的代码求解
这里的新手程序员试图提高C语言水平,所以我开始在一个名为codeforces的网站上解决代码问题。然而,我似乎被卡住了,我写的代码在实践中似乎是可行的,但网站并不认为它是正确的 问题是:C语言中“1A剧院广场”的代码求解,c,math,format-specifiers,C,Math,Format Specifiers,这里的新手程序员试图提高C语言水平,所以我开始在一个名为codeforces的网站上解决代码问题。然而,我似乎被卡住了,我写的代码在实践中似乎是可行的,但网站并不认为它是正确的 问题是: 首都柏林的剧院广场呈长方形,大小为n × 米。在该市的周年纪念日之际,决定用方形花岗岩石板铺设广场。每块石板的大小都是a × A.铺设广场最少需要多少块石板?允许覆盖比剧院广场大的表面,但广场必须被覆盖。不允许打碎石板。石板的侧面应与广场的侧面平行 资料来源: 我确实很难完全理解这个问题背后的数学原理,我使用了
首都柏林的剧院广场呈长方形,大小为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:不是图书馆。它是一个头文件。头文件通常用于声明内容。基本上,它们只是包含信息或编译器的源代码。有时它们声明库中的例程。但是实际的例程在不同的文件中,链接程序时必须包含这些文件。但是仅仅声明类型的名称和一些宏来帮助使用这些类型。所以它只是一个没有关联库的源代码文件。