在几秒钟内将数字拆分为天,小时,分钟和秒?

时间:2011-06-11 02:17:10

标签: math logic theory modulus

我听说可以使用大多数编程语言中存在的模%运算符来实现这一点。真正的问题是,怎么样?我不熟悉模数是如何工作的,所以我在过去使用它时遇到了困难。鉴于现在的时间是自1970年以来的几秒钟1307758473.484,我怎样才能计算出使用模数的天数,天数,小时数和分钟数?

我基本上希望将其格式化为:“5年,10天,12小时,7分钟和18.56秒”。我该怎么做?我真的很想学习这背后的逻辑,并且对简单的插入式解决方案感兴趣。

3 个答案:

答案 0 :(得分:24)

当你进行整数除法时,你得到商和余数。例如,

5 divided by 3 is quotient 1 with remainder 2.

在编程语言中,这通常表示为:

5 / 3   # => 1
5 % 3   # => 2

您想要的转换只是对此的重复。 从较低的单位开始并在上走得更高。

首先,你有

  • 1307758473.484 seconds

60秒是1分钟,

1307758473.484 / 60 = 21795974  (intended to be integer division)
1307758473.484 % 60 = 33.484,

相同
  • 21795974 minutes 33.484 seconds

60分钟是1小时,

21795974 / 60 = 363266
21795974 % 60 = 14

它与

相同
  • 363266 hours 14 minutes 33.484 seconds

现在,有一点困难。大多数日子是24小时。当有闰秒时,它不是。如果你忽略闰秒并假设1天是24小时,那么,通过计算,

363266 / 24 = 15136
363266 % 24 = 2

它与

相同
  • 15136 days 2 hours 14 minutes 33.484 seconds

同样,大多数年份是365天。当有闰日(年)时,它不是。如果忽略闰日并假设1年是365天,那么通过计算,

15136 / 365 = 41
15136 % 365 = 171

它与

相同
  • 41 years 171 days 2 hours 14 minutes 33.483 seconds

答案 1 :(得分:4)

模数在执行整数除法时返回余数。

我认为最容易理解如何通过首先解决问题来使用Mod。

让我们从小时,分钟和秒开始简单 - 准确地说是1小时10分30秒。

首先,你有30秒。这很容易 - 它只有30个。没有脑子。 现在添加分钟 - 将分钟数确定为您将它们乘以60的秒数。因此,10分30秒= 630秒。

现在我们看看mod是如何工作的 - 因为如果你 630除以60就会得到10.5,但是如果你忽略了分数(整数除法),你会得到10.余数是秒。

因此,如果MOD 630乘60,则得到30 - 剩下的剩余部分将630除以30。

因此,要确定分钟和秒数,请将分数除以60,将秒数除以60。

现在加一个小时。一小时= 60分钟,60分钟为60 * 60秒,因此1小时= 3600秒。 3600 + 600 + 30 = 4230秒。

4230/3600(1小时)= 1 - 所以我们有一个小时

4230%(mod)3600 = 630 - 抓住这个,现在我们处理几分钟。

所以,如果你进一步充实并添加一天 - 1天= 24小时= 24 * 3600 = 86400 86400 + 3600 + 600 + 30 = 90630

90630/86400 = 1 - > 1天

90630%86400 = 4230 - >剩下几秒

4230/3600 = 1 - > 1小时

并重复上述逻辑。

希望有助于清理它 - 你不断重复这个迭代,你可以做几周和几年,但是几个月是特殊的,因为它们是不规则的,闰年也是如此。

答案 2 :(得分:0)

每当从较小的基本单位(秒)转换为一系列较大的单位(分钟/小时/天/年/年/十年/世纪/千禧年)时,都可以使用模数(%)运算符来跟踪剩余的基本单位提取每个大单位时的单位。

这是一种优雅/简单的方法,可以使基本单位保持总计。开始以所需的最大单位提取BaseUnit,然后逐步解决,直到获得原始BaseUnit。

这仅在提取的单位不为零时有效。如果为零,则说明您根本没有提取基本单位,也不需要模运算符。

重要的是要记住,模运算的结果将始终在原始基本单元中。可能会造成混淆。

我们将一百万秒重设为较大的时间单位。假设1年= 31,536,000秒,并且没有leap年或其他日历调整。

#include <cstdio>
#define SEC2CENT 3153600000
#define SEC2DEC 315360000
#define SEC2YR 31536000
#define SEC2MONTH 2592000
#define SEC2WEEK 604800
#define SEC2DAY 86400
#define SEC2HOUR 3600
#define SEC2MIN 60
main()
{
unsigned int sec = 1000000; //I am 1 million seconds old or...

unsigned int centuries = sec / SEC2CENT;
if (centuries) sec = sec % SEC2CENT; //if nonzero update sec

unsigned int decades = sec / SEC2DEC;
if (decades) sec = sec % SEC2DEC; //the purpose of modulo for units is this running total of base units

unsigned int years = sec / SEC2YR;
if (years) sec = sec % SEC2YR;

unsigned int months = sec / SEC2MONTH;
if (months) sec = sec % SEC2MONTH;

unsigned int weeks = sec / SEC2WEEK;
if (weeks) sec = sec % SEC2WEEK;

unsigned int days = sec / SEC2DAY;
if (days) sec = sec % SEC2DAY;

unsigned int hours = sec / SEC2HOUR;
if (hours) sec = sec % SEC2HOUR;

unsigned int minutes = sec / SEC2MIN;
if (minutes) sec = sec % SEC2MIN;

unsigned int seconds = sec; //seconds should now be less than 60 because of minutes

printf("I am now exactly %u centuries, %u decades, %u years, %u months, %u weeks, %u days, %u hours, %u minutes, %u seconds old and that is very old indeed.", centuries, decades, years, months, weeks, days, hours, minutes, seconds);
}