是否有通用的方法来计算组件值,例如从天或英里+码+英尺+英寸到英寸的年+月+日?

时间:2009-08-06 09:23:58

标签: math components

我知道必须有一个通用方法,但我甚至不知道要搜索的术语,我不想重新发明轮子。

'单独的组件值'和'复合值'不会产生良好的效果。

另一个例子:从弧秒开始的度数+分钟+秒,或从盎司开始的吨+磅+盎司。

我在C工作,但不应该很难从其他语言翻译。

输入将是基本值,例如总英寸= 9534567,以及单位分割,例如英尺= 12,码=英尺* 3,英里=码* 1760。输出将是150英里,849码,0英尺和3英寸。

当然,这可以推广到使用其他一些单位划分。整个图书馆看起来有点矫枉过正,不是吗?

5 个答案:

答案 0 :(得分:1)

每个复合值都没有通用的方法。您给出的每个示例在每个示例的“拆分”中都完全不同。由于月长等的差异,最糟糕的当然是约会。

对于其他人,您可能会为每个值提供一个“截止”列表并返回每个值的列表。然后你几乎只有模数和除法运算来分解值。

答案 1 :(得分:1)

在大多数情况下,计算非常简单,但编码所有转换因子可能会很繁琐。

然而,涉及持续时间的计算在概念上是困难的。一年有多少天?是365 ......还是366?一年多少秒?

答案 2 :(得分: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

答案 3 :(得分: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

上面几天它变得混乱,因为几个月和几年有不同的长度。

答案 4 :(得分:0)

在数学上单位之间的转换仅涉及分割或乘法的简单的一步或两步过程,具体取决于您在单位之间进行的方式。一个简单的例子是度量系统的对数标度: 从米到厘米,你乘以100,因为一米多100厘米。

我不知道任何C,但你真正需要知道的是转换因子以及你的单位幅度是上升还是下降。这应该适用于设计良好的系统,例如公制系统,其中事物以对数标度进行,但转换因子不同,如果您尝试使用单个因子进行转换,则会在英制系统中遇到麻烦。你可以让你的程序以不同的单位递增或递减。所以你可以去:

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

然后除法会反转,保持转换因子不变。

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