我需要编写一个程序来计算自1970年1月1日以来的年,月,周,天和小时数。唯一的陷阱是,月数不能超过12,周不能超过4,依此类推。
我一直在尝试各种不同的方法,例如使用模数运算符,并在总秒数方面进行一些尝试,但此时的逻辑超出了我的范围。
这是我的代码
#include <stdio.h>
#include <time.h>
int main() {
long now = time(NULL);
long secondsInMinute = 60;
long secondsInHour = secondsInMinute * 60;
long secondsInDay = secondsInHour * 24;
long secondsInWeek = secondsInDay * 7;
long secondsInMonth = secondsInDay * 30.42;
long secondsInYear = secondsInMonth * 12;
long years = now/secondsInYear;
long months = (now-(years*secondsInYear))/secondsInMonth;
long weeks = (now-((years*secondsInYear)+(months*secondsInMonth)))/secondsInWeek;
long days;
long hours;
printf("Since Jan 1st, 1970: ");
printf("\n%ld years have passed!", years);
printf("\n%ld months have passed!", months);
printf("\n%ld weeks have passed", weeks);
printf("\n%ld days have passed", days);
printf("\n%ld hours have passed", hours);
return 0;
}
我的指示告诉我假设一个月中有30.42天,一年中有365天。
我能够得到年数,但是月数为9,根据我看过的一些在线计算器,这是不正确的。这主要是我的逻辑问题,我似乎无法全神贯注于如何做到这一点。
示例输出为
30 years, 4 months, 2 weeks, 4 days, 5 hours
显然,这不是实际的时间量,而只是我的输出需要使用的格式的一个示例。我们将提供任何帮助。
答案 0 :(得分:1)
我的指示告诉我假设一个月中有30.42天,一年中有365天。
以下代码是主题浮点不正确。最好用整数数学形成常数。这里我们还利用了一天中的秒数是100的倍数的优点,因此secondsInMonth
的精确度是“一个月中的30.42天”。
// long secondsInMonth = secondsInDay * 30.42;
long secondsInMonth = secondsInDay * 3042 / 100;
鉴于每年365天和每月30.42天,则每年没有12个月@g_bor。
不要使用12
来形成年份常数,而是使用SEC_PER_YEAR (365LL*SEC_PER_DAY)
让宏成为您的朋友。
要以较大的单位(例如 year 或 month )查找秒的总数,请不要编写类似#define SEC_PER_YEAR 31536000
的代码,这样很容易出错,并且不会记录代码如何到达幻数。而是建立价值。确保计算使用wide enough constants。这与OP所做的很接近。
假设time()
返回自1970年1月1日以来的秒数,通常的奇数可以忽略(le秒,夏令时,时区,时代,分辨率等),... < / p>
从最大的单位开始执行一系列/
和%`。
#include <stdio.h>
#include <time.h>
#define SEC_PER_MIN 60
#define SEC_PER_HOUR (60*SEC_PER_MIN)
#define SEC_PER_DAY (24L*SEC_PER_HOUR)
#define SEC_PER_WEEK (7L*SEC_PER_DAY)
#define SEC_PER_MONTH (3042LL*SEC_PER_DAY/100)
#define SEC_PER_YEAR (365LL*SEC_PER_DAY)
int main(void) {
time_t now = time(NULL);
printf("%s", ctime(&now));
long long t = now;
printf("Since Jan 1st, 1970:\n");
printf("%lld years have passed!\n", t / SEC_PER_YEAR);
t %= SEC_PER_YEAR;
printf("%lld months have passed!\n", t / SEC_PER_MONTH);
t %= SEC_PER_MONTH;
printf("%lld weeks have passed\n", t / SEC_PER_WEEK);
t %= SEC_PER_WEEK;
printf("%lld days have passed\n", t / SEC_PER_DAY);
t %= SEC_PER_DAY;
printf("%lld hours have passed\n", t / SEC_PER_HOUR);
t %= SEC_PER_HOUR;
}
输出
Mon Sep 21 20:40:26 2020 (local time)
Since Jan 1st, 1970:
50 years have passed!
9 months have passed!
0 weeks have passed
3 days have passed
6 hours have passed
“月数为9”->差不多了。
“月数不能超过12”-> 365 <12 * 30.42(365.04),所以没问题。
“周(不能)超过4周”-> 30.42 <5 * 7,所以那里也没有问题。