为什么我的地区问题给出了错误的答案?

时间:2019-10-26 10:42:15

标签: c

我正在学习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)相交,如下图所示。 enter image description here

计算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;
}

请帮助我改进代码。谢谢。

2 个答案:

答案 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

该跟踪保证tnArea是整数。然后,我们需要的代码是:

#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 */
    }
}

可以简单地扩展代码以检查tn是否在给定范围内。