我正在学习c。因此,我在网上担任法官。我在问题背后有逻辑,并提交了答案错误。有什么问题吗?
问题: 区域 100点·限制1s,512 MB
在此问题中,您将得到一个长度为n的正方形。正方形的坐标为(0,0),(n,0),(n,n),(0,n)。您需要绘制4条直线:
从(0,1)到(n,n-1)的线 从(1,0)到(n-1,n)的线 从(0,n-1)到(n,1)的线 从(1,n)到(n-1,0)的线 这四条线将在一个点(x,y)相交,如下图所示。
计算A + B + C + D的总面积(四个角单元正方形除外)。
输入 输入将以整数T开头。然后将有T种情况。每个个案将包含一个整数N。1 <= T <= 100000 3 <= n <= 1018
输出 对于每个测试用例,请在不带引号的情况下打印“ Case x:y”,其中x是案例编号,y是必需答案。
保证y始终是整数。
样本 输入输出 1个 6 情况1:8
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
int main()
{
int test, i;
scanf("%d", &test);
for(i=0; i<test; i++)
{
double n, area, a,x, b1, b, s, tri, area1, area_t;
scanf("%lf", &n);
area= n*n;
a=n-2;
x=n/2;
b1= (x-1)*(x-1) + x*x;
b= sqrt(b1);
s= (a+b+b)/2;
area1= s*(s-a)*(s-b)*(s-b);
area_t = (4* sqrt(area1));
printf("Case %d: %.0lf\n",i+1, (area-(area_t + 4)));
}
return 0;
}
请帮助我改进代码。谢谢。
答案 0 :(得分:1)
我认为您遇到兼容性问题,并且在线判断是在不存在"%lf"
的C89实现中进行的,从而使程序输出
Case 1: %.0lf Case 2: %.0lf ...
尝试使用C89说明符
printf("Case %d: %.0f\n", i + 1, area - (area_t + 4));
/* ^^^^ C89, not %.0lf */
注意:double x; scanf("&lf", &x)
自C89开始有效。
答案 1 :(得分:-1)
让Area
为请求的区域,可以将其计算为:
Area = OuterSquareArea - 4 * IsoscelesTringleArea - 4 * SmallSqareArea
其中:
OuterSqareArea = n * n
IsoscelesTriangleArea = base * height / 2
= (n - 2) * (n / 2) / 2
= (n - 2) * n / 4
SmallSquareArea = 1 * 1
= 1
Area
的计算可总结为:
Area = (n * n) - 4 * ((n - 2) * n / 4) - 4 * (1)
= n * n - (n - 2) * n - 4
= (n - (n - 2)) * n - 4
= 2 * n - 4
该跟踪保证t
,n
和Area
是整数。然后,我们需要的代码是:
#include <stdio.h>
int main() {
int i, t, n;
scanf("%d", &t); /* read t */
for (i = 1; i <= t; i++) { /* for any i in [1,t] */
scanf("%d", &n); /* read n */
printf("Case %d: %d\n", i, 2 * n - 4); /* solve */
}
}
可以简单地扩展代码以检查t
和n
是否在给定范围内。