2014-12-04 316 views
-2

這不是嚴格意義上的編碼問題,因爲我負責電子表格而不是代碼,但應用了相同的原則。避免while循環

我試圖創建一個「平均預測器」的電子表格。舉個例子:說一個擊球手從40局平均得到24分(換句話說,已經得到960分)。如果他從現在起每場比賽平均執行40次,那麼他需要多少局才能將自己的職業生涯平均提高到30?

用手工處理這個例子非常容易,並且就像用while循環解決一般問題一樣簡單。但是,如前所述,我不能使用循環。任何想法或建議?

+3

使用代數開發一種通式,然後寫對應於式代碼。 – StriplingWarrior 2014-12-05 00:01:21

+1

這個問題似乎是題外話題,因爲它是關於解決數學問題 – AakashM 2014-12-05 10:52:35

回答

2

您不需要爲此目的的循環。你可以用下面的公式(moving average)解決它:

(current_avg * current_innings + avg * x)/(current_innings + x) = goal_avg 

你必須解決方程x

您例如在Wolfram Alpha的計算:

輸入:(24 * 40 + 40 * x)/(40 + x) = 30 solve x 結果:x=24

Link

0

正如有關問題的意見建議@StriplingWarrior,寫出來的一般方程,解它以代數形式表示,並在電子表格中使用生成的公式。原始方程由@trylimits在前面的答案中給出。我使用略有不同的標識襯托出了問題的對稱性:

(old_avg * old_innings + new_avg * new_innings)/(old_innings + new_innings) 
       = goal_avg 
old_avg * old_innings + new_avg * new_innings 
       = goal_avg * (old_innings + new_innings) 
old_avg * old_innings + new_avg * new_innings 
       = goal_avg * old_innings + goal_avg * new_innings 
new_avg * new_innings - goal_avg * new_innings 
       = goal_avg * old_innings - old_avg * old_innings 
new_innings * (new_avg - goal_avg) = old_innings * (goal_avg - old_avg) 

如果new_avg - goal_avg爲零,有沒有辦法解決,除非goal_avg - old_avg也爲零,在這種情況下,無需改變和new_innings可以爲零。如果new_avg - goal_avg非零:

new_innings = old_innings * (goal_avg - old_avg)/(new_avg - goal_avg) 

這個等式的右手邊是你可以把在電子表格中的公式。

從該示例中的值是:

old_avg = 24 
old_innings = 40 
new_avg = 40 
goal_avg = 30 

new_innings = 40 * (30 - 24)/(40 - 30) 
      = 240/10 
      = 24