2009-08-06 44 views
0

我知道必須有一個通用的方法,但我甚至不知道要搜索的術語,我不想重新發明輪子,很糟糕。是否有一種通用的方法來計算組件數值,例如從幾天或英里+英尺+英尺+英寸到英寸的年+日+日?

'單獨元件值'和'複合值'不給好結果。

另一個例子:弧度秒+分鐘+秒或噸+磅+盎司盎司。

我在C工作,但它不應該是很難從其他語言翻譯。

輸入值將是基本值,比如總英寸= 9534567,單位分數,如英尺= 12,碼=英尺* 3,英里=碼* 1760。輸出將是150英里,849碼,0英尺和3英寸。

當然,這可以推廣到使用一些其他單位部門集。而整個圖書館似乎有點矯枉過正,不是嗎?

+0

請你重新制定您的問題或要求的東西更精確? – ThibThib 2009-08-06 09:34:35

回答

1

如前所述,這在處理非標準長度的中間元素時更加困難。然而,鑑於一套標準減免你可以計算使用下列內容:

void components (long value, long * parts, int parts_sz, long * result) { 

    int i = 0; 
    for (; i < parts_sz; ++i) { 
     result[i] = value/parts[i]; 
     value %= parts[i]; 
    } 
} 

int main() { 

    int i = 0; 
    long parts[] = {10000, 1000,100,10,1}, result[] = {0,0,0,0,0}; 
    long value = 99853; 

    components (value, parts, 5, result); 

    for (; i < 5; ++i) 
     printf ("There were %ld %lds\n", result[i], parts[i]); 

    retrun 0; 
} 

其中產量:

There were 9 10000s 
There were 9 1000s 
There were 8 100s 
There were 5 10s 
There were 3 1s 
+0

如果休息時間固定但長度不同,如英里+碼+英尺+英寸,那麼該怎麼辦? – willc2 2009-08-08 04:50:41

+0

好吧,但如果參數都是由同一個基地表示,那麼它就沒有關係。例如碼/英尺/英寸將是 組件(36,12,1) – ezpz 2009-08-08 14:11:34

+0

他們說它不能完成。 – willc2 2009-08-11 05:59:26

1

對於每個複合值都沒有通用的方法。你給出的每個例子在每個例子的「分割」中都有很大的不同。當然最糟糕的是日期由於月份長度的差異等。

對於其他人,你可能可以管理一些東西,提供每個值的'cutoffs'列表並返回一個列表每一個。然後你幾乎只需要進行模數和除法操作就可以分解值。

+0

+1爲「模數」,我認爲是所需的答案 – 2009-08-09 21:04:48

0

在數學上這是整數除法與餘數。在C(和Java,...)中,可以分別使用/和%運算符來計算商和餘數。

編輯:

1249559005844: "6. August 2009 11:43:25 UTC" 
1249559005844 % 1000 = 844 
1249559005844/1000 = 1249559005 
1249559005 % 60 = 25 
1249559005/60 = 20825983 
20825983 % 60 = 43 
20825983/60 = 347099 
347099 % 24 = 11 
347099/24 = 14462 

以上天它就會變得混亂,因爲幾個月和幾年有不同的長度。

+0

您是否願意爲僅在短時間內進行編程的感興趣的各方展示一個示例? – willc2 2009-08-06 10:40:03

+1

即使在以下日子裏,它也很麻煩 - 由於夏令時間的限制,您可以有23或25小時的一天,「24小時後」和「第二天,同一時間」並不總是相同的事情。 – 2009-08-06 11:53:01

+0

@邁克爾Borgwardt但這是一個不同的混亂。將原始時間分解爲組件後,可以考慮時區等。而且,如果沒有夏時制,世界將會變得更加美好,複雜程度更低,並且有更多時間入睡。 – starblue 2009-08-06 11:58:16

0

單位之間的單位轉換僅涉及簡單的一步或兩步分割或乘法過程,具體取決於單位之間的走向。一個簡單的例子是公制系統的對數刻度: 要從米到釐米乘以100,因爲米有100釐米。

我不知道任何C,但所有你真正需要知道的是換算係數以及你是在單位數量級上漲還是下跌。這應該適用於設計良好的系統,例如公制系統,其中的對數尺度變化,但轉換系數與帝國系統不同,如果您嘗試使用單一因子進行轉換,則會遇到麻煩。你可以讓你的程序以遞歸方式遞增或遞減不同的單位。所以,你可以去:

Metres (n*100)-> cm (cm*10) -> mm (mm*1000) -> µm 

,然後除以只想去在翻領,保持轉換系數相同。

道德故事:不要使用帝國制度。

+0

這是一件好事,我們現在使用公制系統。 – willc2 2009-08-06 10:38:34

+0

http://zapatopi.net/metrictime/ 但是60秒/分鐘可以追溯到巴比倫人認爲一年有360天的時候。 – 2009-08-06 11:39:43

1

在大多數情況下,計算非常簡單,但編碼所有轉換因子可能很繁瑣。

但是涉及持續時間的計算在概念上是困難的。一年有多少天?它是365 ...還是366?一年多少秒?

+1

即使在一天中的小時數不固定... – 2009-08-06 11:49:57

相關問題