2014-05-24 80 views
1

問題陳述:損失的精度 - Java的

寫方法whatTime,這需要一個int,秒,表示自午夜某一天的秒數,並返回格式化爲一個字符串「::」 。此處表示自午夜以來的完整小時數,表示自上次完成小時結束以來的完整分鐘數,並表示自上次完整分鐘結束以來的秒數。每個,並且應該是一個整數,沒有額外的前導0。因此,如果秒是0,你應該回到 「0:0:0」,而如果秒是3661,您應該返回 「1:1:1」

我的算法:

這裏是如何我的算法應該用於輸入3661工作:

  1. 三千六分之三千六百六十一= 1.016944 - >這意味着的小時數是1
  2. 減去即1.016944-1 = 0.016944
  3. 經過的小時數
  4. 乘以60即0.01694 4 * 60 = 1.016666 - >經過的分鐘數等於1
  5. 減去已用完的總分鐘數,即1.01666-1 = 0.01666。將其與60相乘。這將產生經過的秒數。

然而,產生的輸出是1:1:0。我試圖使用打印語句,看起來'answer3'變量的值是0.999,這就是打印整數部分(0)的原因。我試圖使用Math.ceil()函數來整理值,它會產生一個正確的輸出。不過,當我提交我的代碼(TopCoder SRM 144 Div2)時,我只能得到大約60/250分。任何改進算法的見解都會有所幫助。

public class Time 
{ 
public String whatTime(int seconds) 
    { 
     double answer1,answer2,answer3; int H; 

     answer1=(double)seconds/3600; 

     H=(int)answer1; 

     answer2=(double)((answer1-H)*60); 

     int M=(int)answer2; 

     answer3=answer2-M; 

     answer3=(double)answer3*60; 
     int S=(int)answer3; 

     String answer=Integer.toString(H); 

     answer=Integer.toString(H)+":"+Integer.toString(M)+":"+Integer.toString(S); 

     return answer; 

    } 
} 
+0

使用'long'而不是'double'。在幾秒鐘內做你的減法。並學習如何使用'%'餘數運算符。 –

回答

3
public String whatTime(int seconds) { 

    int secondVal = seconds % 60; 
    int minutes = seconds/60; 
    int minuteVal = minutes % 60; 
    int hours = minutes/60; 
    int hourVal = hours % 24; 
    int daysVal = hours/24; 

    String answer = "" + daysVal + ":" + hourVal + ":" + minuteVal + ":" + secondVal; 

    return answer; 
} 

可以做格式更優雅,但這是基本的想法。

0

你可以通過用整數工作解決這個問題:

  1. 三千六分之三千六百六十一= 1.016944 - >這意味着的小時數是1
  2. 減去的小時數* 3600 - 即3661 - (1 * 3600)= 61
  3. 61/60 = 1.0166666 - >經過的分鐘數等於1
  4. 減去分鐘數* 60即61-(1 * 60)= 1。這產生了經過的秒數。
+0

如果你用ints Woking,你怎麼可能得到1.016944? – EJP

+0

@EJP我的意思是,在完成除法之後,您將返回包含剩餘秒數的整數值,以便減去屬於整小時或分鐘的秒數。當然,如果你把除法的結果放在一個int變量中,你的結果將是一個int。 – Eran

3

避免浮點值,並完全使用整數或長整數。