2016-07-23 60 views
1

定義的整數k的基於正整數的舍入爲n到k的最近倍數。如果n的兩個倍數等距離使用較大者。整數基於舍入問題

的5 4基於舍入爲4,因爲圖5是更接近於4比它是8,

5的基於5舍入爲5,因爲圖5是更靠近5,它是10個,

的6 4基於舍入爲8,因爲圖6是從圖4和8等距離的,所以更大的一個被用於

寫命名doIntegerBasedRounding函數,將一個整數數組和舍入使用n個所有其陽性元素基於整數舍入。 A中的陣列的負元件不被修改並且如果n < = 0時,沒有所述陣列的元素被修改。最後,您可能會認爲 陣列至少有兩個元素。

的問題,我面對了兩起案件

({1, 2, 3, 4, 5},2) and ({-18, 1, 2, 3, 4, 5},4) 

我越來越

[0, 2, 2, 4, 4] and [-18, 0, 0, 4, 4, 4] 

而不是

{2, 2, 4, 4, 6} and {-18, 0, 4, 4, 4, 4} 

這裏是我的代碼

class doIntegerBasedRounding { 
public static void main(String[] args) { 
    System.out.println(Arrays.toString(doIntegerBasedRounding(new int []{1,2,4,5,6,7,8,9,9},5))); 
    System.out.println(Arrays.toString(doIntegerBasedRounding(new int []{1, 2, 3, 4, 5},2))); 
    System.out.println(Arrays.toString(doIntegerBasedRounding(new int []{1, 2, 3, 4, 5},3))); 
    System.out.println(Arrays.toString(doIntegerBasedRounding(new int []{1, 2, 3, 4, 5},-3))); 
    System.out.println(Arrays.toString(doIntegerBasedRounding(new int []{-1, -2, -3, -4, -5},3))); 
    System.out.println(Arrays.toString(doIntegerBasedRounding(new int []{-18, 1, 2, 3, 4, 5},4))); 
    System.out.println(Arrays.toString(doIntegerBasedRounding(new int []{1, 2, 3, 4, 5},5))); 
    System.out.println(Arrays.toString(doIntegerBasedRounding(new int []{1, 2, 3, 4, 5},100))); 
    } 

public static int[] doIntegerBasedRounding(int[]a, int n){ 
    int temp; 
    int[] b= new int[a.length]; 
    if(n<0) 
     return a; 
    for (int i =0; i<a.length; i++){ 
     if(a[i]<=0){ 
      b[i]=a[i]; 
     } 
     else if(a[i]>0) { 
     temp = a[i]%n; 
      if(temp>n/2) { 
       b[i] = a[i] + (n - temp);} 
      if (temp<=n/2){ 
       b[i]= a[i]-temp; 
      } 
      } 
     } 
    return b; 
    } 
} 
+2

你應該切換您的條件,首先是'temp> = n/2'和第二個'temp garnulf

+0

@ garnu如果我試着這樣做。它糾正了上述數組的結果,但改變了其他兩個數組(第3和第6)的結果。而不是** {0,3,3,3,6}和{0,0,5,5,5} **,我得到了** [3,3,6,6]和[0,5 ,5,5,5] ** – roooseon

+0

您需要另外除以2.0否則3/2結果爲1不是1.5 – garnulf

回答

0

我會改變這樣的代碼:

else if (a[i] > 0) { 
    temp = a[i] % n; 
    if (temp > n/2) { 
     b[i] = a[i] + (n - temp); 
    } 
    if (temp <= n/2) { 
     b[i] = a[i]-temp; 
    } 
} 

要:

else if (a[i] > 0) { 
    temp = a[i]/n; 
    if ((n*temp - a[i]) * -1 < n*(temp+1) - a[i]) { 
     b[i] = n*temp; 
    } 
    else { 
     b[i] = n*(temp+1); 
    } 
} 
0

讓我提出一個不同的方法:

呼叫你與v工作的價值:

  1. 計算remainde除以v通過n
  2. 減去該餘數由v當r;這導致向下舍入
  3. 如果餘數是等於或大於n/2,添加n;這導致四捨五入。

在代碼中,爲您的特定問題結構:

public void doIntegerBasedRounding(int[] values, int n) 
{ 
    if (n > 0) 
    { 
     for (int i=0; i<values.length; i++) 
     { 
      if (values[i] > 0) 
      { 
       int rem = values[i]%n; 
       values[i] = values[i] - rem + (rem>=n/2 ? n : 0); 
      } 
     } 
    } 
} 
0

你需要做的在浮動精度,如果塊比較的是編譯器在INT精度,同時分工忽略浮動值算術運算。

,所以你只需要在測試表達式添加浮動元素。

下面

是正常工作的方法:運行以下

private static int[] doIntegerBasedRounding(int[] is, int i) { 
    i = Math.abs(i); 
    for (int j = 0; j < is.length; j++) { 
     int mod = is[j] % i; 
     if (is[j] >= 0) { 
      if (mod < i/2f) 
       is[j] -= mod; 
      else 
       is[j] += (i - mod); 
     } 
    } 
    return is; 
} 

public static void main(String[] args) { 
     System.out.println(Arrays.toString(doIntegerBasedRounding(new int[] { 1, 2, 4, 5, 6, 7, 8, 9, 9 }, 5))); 
     System.out.println(Arrays.toString(doIntegerBasedRounding(new int[] { 1, 2, 3, 4, 5 }, 2))); 
     System.out.println(Arrays.toString(doIntegerBasedRounding(new int[] { 1, 2, 3, 4, 5 }, 3))); 
     System.out.println(Arrays.toString(doIntegerBasedRounding(new int[] { 1, 2, 3, 4, 5 }, -3))); 
     System.out.println(Arrays.toString(doIntegerBasedRounding(new int[] { -1, -2, -3, -4, -5 }, 3))); 
     System.out.println(Arrays.toString(doIntegerBasedRounding(new int[] { -18, 1, 2, 3, 4, 5 }, 4))); 
     System.out.println(Arrays.toString(doIntegerBasedRounding(new int[] { 1, 2, 3, 4, 5 }, 5))); 
     System.out.println(Arrays.toString(doIntegerBasedRounding(new int[] { 1, 2, 3, 4, 5 }, 100))); 
    } 

產生輸出:

[0, 0, 5, 5, 5, 5, 10, 10, 10] 
[2, 2, 4, 4, 6] 
[0, 3, 3, 3, 6] 
[0, 3, 3, 3, 6] 
[-1, -2, -3, -4, -5] 
[-18, 0, 4, 4, 4, 4] 
[0, 0, 5, 5, 5] 
[0, 0, 0, 0, 0]