2016-02-15 96 views
-1

在此代码中如何避免截断整数除法?我排序的数组是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; 
} 
+1

C或C++?他们是不同的语言。 –

+1

该帖子无效C代码。 – chux

+0

将'long long'转换为'float'对于大数值肯定会失去精度。 – chux

回答

1

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

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

会给出更好的结果。

0

的结果:

arr[n]/2 

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

为了得到你所需要的精确度,将之前使两个操作数float S:

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

当然只有一个需要成为一个浮动?我经常做类似'arr [n]/2.0'的操作,以强制表达式浮点。 (现在我想知道没有文字后缀的默认精度是什么) –

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)具有该签名。