截断的整数除法删除

truncated integer division removal

本文关键字:除法 删除 整数      更新时间:2023-10-16

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

b 变量不能容纳浮点数,因为它是一个整数。不仅转换为float发生得太晚,而且您将结果存储在整数变量中。你怎么能期待整数结果以外的东西?

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

会给更好的结果。

结果:

arr[n] / 2

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

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

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

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

将值缩放 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 %lldn",  a2);
    printf("b*2 %lldn",  b2);
    long long m2 = min(a2,b2);
    printf("m*2 %lldn",  m2);
    long long ans2 = min(m2 * n + m2 * 2LL * n, w*2);
    printf("answers*2 %lldn",  ans);
    printf("answers %lld.%dn",  ans2/2, abs(ans%2)*5);
    return 0;
}

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