2009-08-06 74 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

相关问题