2016-02-15 101 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)具有該簽名。