【问题标题】:How to find empty space in a rectangle which has 2 circles in it?如何在有 2 个圆圈的矩形中找到空白空间?
【发布时间】:2020-04-24 00:04:13
【问题描述】:

我正在解决 Toph 中的一个问题。在这个问题中,我必须找出其中有 2 个相等圆的矩形的空白区域。

here is the problem

#include <stdio.h>
float pi=3.1416;
int main()
{
    int i,t;
    float r,rest;
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {
        scanf("%f",&r);
        rest=(4*r*2*r)-(2*pi*r*r);
        printf("Case %d: %.2f\n",i,rest);
    }
    return 0;

这是我的解决方案。它为第一个测试用例返回正确的值,但无法解决第二个测试用例。 有什么问题???

【问题讨论】:

  • 也许把float改成double
  • 简化公式?
  • 简化公式有问题。对于第一种情况,它返回一个不正确的值。
  • IMO 示例输出错误。
  • edit您的问题并显示您的确切输入以及预期和实际输出。也使用double 代替floatscanf("%f",&amp;r); 代替scanf("%f",&amp;r);

标签: c area


【解决方案1】:

与2和8不同,double更准确的原因是float不能代表3.1416以及输入值:

3.1416 -> 3.1415998935699462890625
40.082 -> 40.082000732421875
85.8   -> 85.8000030517578125

根本就没有足够的精度,(请注意IEEE-754 float,绝大多数用于float,将其存储在base-2中。)很可能,后面的数字可能是为了使测试用例失败而专门生成的.如果想了解更多,Don’t Store That in a FloatWhat Every Computer Scientist Should Know About Floating-Point Arithmetic

数字常数是1.7168,这与他们的pi版本完全相同,(乘以r*r。)单点精度的最佳值是1.7167999744415283203125,即由2.55584716796875E-8 关闭。对于double,它是1.71680000000000010373923942097,由1.0373923942097E-16 加上输入的值。

【讨论】:

    【解决方案2】:

    float pi=3.1416; 是问题的原因。在数学头文件(#include &lt;math.h&gt;)下有一个常量M_PI 使用它来代替。

    编辑: 抱歉,没有仔细阅读,显然问题出在浮点精度上。如果您将所有浮点值更改为双精度值,它应该可以工作。

    #include <stdio.h>
    double pi=3.1416;
    int main()
    {
        int i,t;
        double r,rest;
        scanf("%d",&t);
        for(i=1;i<=t;i++)
        {
            scanf("%lf",&r);
            rest=(4*r*2*r)-(2*pi*r*r);
            printf("Case %d: %.2lf\n",i,rest);
        }
        return 0;
    }
    

    【讨论】:

    • 但是在问题中派的价值已经给出了
    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2022-10-30
    相关资源
    最近更新 更多