algorithm - 如何用 "int"、模数和除法简化表达式?

标签 algorithm perl math

下面的脚本计算了十进制数的时间差,但我得到了一个舍入错误,所以我猜这是因为我最后的转换非常糟糕。

问题

有些东西告诉我,表达式可以简化,但是在这种特定情况下,当我有 int、模数和除法时,数学规则是什么?

#!/usr/bin/perl

print f("9:00", "16:45");

sub f {
    my $t1 = shift @_;
    my $t2 = shift @_;

    my $m1 = $1*60+$2 if $t1 =~ m/(\d\d?):(\d\d?)/;
    my $m2 = $1*60+$2 if $t2 =~ m/(\d\d?):(\d\d?)/;

    my $h = int(($m2-$m1)/60);

    return $h + ($h*60+$m2-$m1)%60/60;
}

最佳答案

您已经正确计算了 $m1$m2 自午夜以来经过的分钟数。那么为什么不简单地以小数小时返回时差:

return ($m2 - $m1) / 60.0;

就“数学规则”而言,查看您的返回值 与我的值并了解它们为何相同(忽略四舍五入)可能会有所帮助:

$h + ($h * 60 + $m2 - $m1) % 60 / 60

请注意 ($h * 60) % 60 为零,因此该术语基本上被删除,留下:

$h + ($m2 - $m1) % 60 / 60

现在想想 $h 是如何计算的:它是 ($m2 - $m1) 除以 60 的商,去掉余数(因为 int())。另一方面,($m2 - $m1) % 60 正好是这个除法的余数。所以上面的表达式本质上只是将你从 $h 中删除的余数加回来。因此它与

的结果相同
($m2 - $m1) / 60

关于algorithm - 如何用 "int"、模数和除法简化表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22184598/

相关文章:

c++ - 嵌套的 if-else 不适用于自定义结构 c++

mysql - 如何避免Mysql中的内部查询

perl - 如果我的字符串包含 's///' ,我该如何使用 '/' ?

python - 作业 : Triangle angle calculation all sides known

c - 欧拉 160 : Find the non trivial 5 digits of the factorial

javascript - 在 JavaScript 中创建重复的数学函数?

algorithm - 可变分区未在 mozart Oz 中引入错误

java - 如果您有一个字符串数组,按升序对该数组进行排序的最快方法是什么?

algorithm - 比较乘法

perl - 使用 Log::Log4perl 制作自记录模块