-1

T 如何避免在此代码中截断整数除法?我的排序数组是1 1 1 1 1 1,所以 a[0] = 1 和 a[n] 应该是 1 / 2 = 0.5。

int main()
{
    long long n,w;
    scanf("%lld %lld", &n, &w);
    long long arr[2*n];
    for(long long i = 0; i < 2 * n; i++)
    {
      scanf("%lld", &arr[i]);
    }
    sort(arr,arr+2*n);

    long long a = arr[0];
    long long b = (float)(arr[n]/2); // <--- this part of code
    cout << " a is " << a << endl;
    cout << " b is " << b << endl;
    long long m = min(a,b);
    cout << " m is " << m << endl;
    long long and = min(m * n + m * 2LL * n, w);
    printf("%lld", ans);
    return 0;
}
4

3 回答 3

1

b变量不能保存浮点数,因为它是整数。不仅您的转换float发生得太晚,而且您将结果存储在一个整数变量中。除了整数结果,你怎么能期待别的呢?

float b = ((float)arr[n])/2.f;

会给出更好的结果。

于 2016-02-15T11:05:16.027 回答
0

的结果:

arr[n] / 2

是一个整数表达式,因为两个操作数都是整数。因此,它执行整数除法,并且您失去了所需的精度。将(整数)结果转换为float之后将无济于事,因为精度不存在

要获得所需的精度,请float在除法之前将两个操作数设为 s:

float b = (float) arr[n] / 2.f;
于 2016-02-15T11:15:31.300 回答
0

如何避免在此代码中截断整数除法?

将值缩放 2,最后只除以 2。

int main(void) {
    long long n,w;
    scanf("%lld %lld", &n, &w);
    long long arr[2*n];
    for(long long i = 0; i < 2 * n; i++)
    {
      scanf("%lld", &arr[i]);
    }
    sort(arr,arr+2*n);

    long long a2 = arr[0]*2;
    long long b2 = arr[n];


    printf("a*2 %lld\n",  a2);
    printf("b*2 %lld\n",  b2);
    long long m2 = min(a2,b2);
    printf("m*2 %lld\n",  m2);

    long long ans2 = min(m2 * n + m2 * 2LL * n, w*2);
    printf("ans*2 %lld\n",  ans);
    printf("ans %lld.%d\n",  ans2/2, abs(ans%2)*5);
    return 0;
}

注意:在 C 中,确保long long min(long long a, long long b)具有该签名。

于 2016-02-15T15:49:15.963 回答