簡體   English   中英

我們怎么能用大數字計算行進距離‽

[英]How could we calculate traveled distance, with big numbers‽

我目前正在解決這個 kata: “我將 go 走多遠?”

描述說:

您最近發現馬以一種獨特的方式行進——它們要么在奔跑(以最高速度),要么在休息(靜止不動)。

以下是一匹特定馬如何旅行的示例:

馬 Blaze 可以以 14 米/秒的速度跑 60 秒,但之后必須 rest 跑 45 秒。

500 秒后,Blaze 將行駛 4200 米。

你的工作是編寫一個 function 來返回一匹馬在給定時間后將行駛多長時間。

輸入:
 totalTime - How long the horse will be traveling (in seconds) runTime - How long the horse can run for before having to rest (in seconds) restTime - How long the horse have to rest for after running (in seconds) speed - The max speed of the horse (in metres/second)

我已經手工完成了微積分:

給定:速度 = 14,運行時間 = 60,休息時間 = 45,總時間 = 500

-> 要計算馬跑了多少時間,我們計算以下內容:

totalTime / (runTime + restTime) = 500 / (60 + 45) = 500 / 105 = 4.76...roundUp(totalTime) = 5

總運行時間 = 5 * 運行時間 = 5 * 60 = 300

--> 計算馬跑了多少距離:

x = 速度 * 總運行時間 = 14 * 300 = 4200

我已將其翻譯為以下代碼:

import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;


public class KataTest {

    @Test
    public void exampleTests() {
        assertEquals(4200, Kata.travel(500, 60, 45, 14));
        assertEquals(1120, Kata.travel(1000, 10, 127, 14));
        assertEquals(1000, Kata.travel(100, 10, 0, 10));
        assertEquals(1000, Kata.travel(100, 10, 0, 10));
        assertEquals(450, Kata.travel(25, 50, 120, 18));
    }
}

當我們運行基本測試時,它給出了預期的 output:

 import org.junit.Test; import static org.junit.Assert.assertEquals; import org.junit.runners.JUnit4; public class KataTest { @Test public void exampleTests() { assertEquals(4200, Kata.travel(500, 60, 45, 14)); assertEquals(1120, Kata.travel(1000, 10, 127, 14)); assertEquals(1000, Kata.travel(100, 10, 0, 10)); assertEquals(1000, Kata.travel(100, 10, 0, 10)); assertEquals(450, Kata.travel(25, 50, 120, 18)); } }

但是,當我們使用高級示例進行測試時,數字更大,它顯示的結果不准確。

例如:

給定:速度 = 6,運行時間 = 34,休息時間 = 180,總時間 = 99094; 預期的 output 是 94524,但是我發布的代碼給了我們 94656

我手工編寫了跟蹤以了解我的代碼的作用:

-> 計算這匹馬跑的總時間:

totalTime / (runTime + restTime) = 99094 / (34 + 180) = 99094 / 214 = 463.05 ... roundUp(totalTime) = 464

總運行時間 = 464 * 運行時間 = 464 * 34 = 15776

--> 計算馬走了多遠:

x = 速度 * 總運行時間 = 6 * 15776 = 94656

那么失敗的測試是:

totalRunTime = (int)Math.ceil( (double)totalTime/(runTime + restTime) ) * runTime;

我的直覺是代碼必須在從 double 到 int 的轉換或使用 Math.ceil 的舍入中改進,但我不知道為什么或如何解決它。 這是我認為我們可以改進的地方:

 totalRunTime = (int)Math.ceil( (double)totalTime/(runTime + restTime) ) * runTime;

我也讀過:

問題不在於四舍五入。 讓我們看一下示例travel(35869784, 90, 100, 5)

根據您的公式35869784/(100+90) = 188788.336 ,四舍五入得到 188789,乘以runTime ,乘以speed得到 84,955,050 米,而正確答案是 84,954,920。 這不是一個四舍五入的問題。 公式是錯誤的。

為什么? 考慮在最后一個 rest 之后的運行。 這匹馬已經跑了 188,788 次 90 秒 + 100 秒的完整迭代,在此期間它在 35,869,720 秒內跑了 84,954,600 米的距離。 在那些“全”跑之后,馬現在只剩下 64 秒可以跑了,比runTime還短!

馬在64秒內跑了多遠? 320米。 所以總數是84,954,600 + 320 = 84,954,920米。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM