计算活了多少天的问题
各位老师,求助!!弄半天了~~总是计算不对,感觉方法是对的,求助求助~~!想法是:
求出出生当年的年份到公元1年1月1日的天数,比如2000年,那么天数就是2000减去1,闰年就366,平年就365,循环加起来;
求出出生当年的月份,比如3月,那么就遍历数组day,day,day 加起来,再加上出生日期那天,若是闰年则加多1天;
当前年月日,同上求出。
两者相减去,就是活了多少天。
第一次写这么多,还不知道怎么贴代码~~!
#include <stdio.h>
// 把公元1年1月1日定为起点,出生日期和当前日期到公元1年1月1日的天数相减为活了多长天数
int main()
{
int day[]={31,28,31,30,31,30,31,31,30,31,30,31};
int year1,year2,month1,month2,day1,day2;
int i;
long intsum1= 0,sum2 =0,days1=0,days2=0,result=0;
printf("请输入你的出生日期,如2000-2-3\n");
scanf("%d-%d-%d",&year1,&month1,&day1);
printf("请输当前日期,如2000-2-3\n");
scanf("%d-%d-%d",&year2,&month2,&day2);
// 计算出生那年到公元1年的天数
for(i=1,sum1 = 0;i<year1;i++)
{
if((( year1 % 4 == 0 ) &&(year1 % 100 != 0)) ||(year1 % 400 == 0))
{
sum1 += 366;
}
else
{
sum1 += 365;
}
}
//计算当前这年到公元1年的天数
for(i=1,sum2 = 0;i<year2;i++)
{
if((( year2 % 4 == 0 ) &&(year2 % 100 != 0)) ||(year2 % 400 == 0))
{
sum2 += 366;
}
else
{
sum2 += 365;
}
}
//计算出生那年月份及日期所占天数
for(i=0; i<= month1-1;i++) //先计算几个月的总天数
{
days1 += day;
}
if((month1 > 2) && (( year1 % 4 == 0 ) &&(year1 % 100 != 0)) ||(year1 % 400 == 0))//如果是闰年,并大于2月,则加多1天
{
days1 = days1 +1 ;
}
else
{
days1 =days1;
}
days1 = days1 + day1;
//计算当前这年月份及日期所占天数
for(i=0; i<= month2-1;i++)
{
days2 += day;
}
if((month2> 2) && (( year2 % 4 == 0 ) &&(year2 % 100 != 0)) ||(year2 % 400 == 0))
{
days2 = days2 +1 ;
}
else
{
days2 =days2;
}
days2 = days2 + day2;
printf("sum1=%d\n",sum1);
printf("sum2=%d\n",sum2);
printf("days1=%d\n",days1);
printf("days2=%d\n",days2);
result = ( sum1 + days1) - (sum2 + days2);
printf("从出生到现在你活了%d天啦!开心吗?",result);
return 0;
} 注意注释中的
// 此处犯了个大错,估计和你一样,leapYear(i)写成leapYear(year)了
#include <stdio.h>
int leapYear(int y);
int calcDay(int year, int month, int day);
// 把公元1年1月1日定为起点,出生日期和当前日期到公元1年1月1日的天数相减为活了多长天数
int main()
{
int startYear, startMonth, startDay, endYear, endMonth, endDay;
int startDays, endDays, myDays;
printf("请输入你的出生日期,如2000-2-3\n");
scanf("%d-%d-%d",&startYear,&startMonth,&startDay);
printf("请输当前日期,如2000-2-3\n");
scanf("%d-%d-%d",&endYear,&endMonth,&endDay);
startDays = calcDay(startYear, startMonth, startDay);
endDays = calcDay(endYear, endMonth, endDay);
myDays = endDays - startDays;
printf("从出生到现在你活了%d天啦!开心吗?\n", myDays);
}
int calcDay(int year, int month, int day)
{
int mday[]={31,28,31,30,31,30,31,31,30,31,30,31}; // 平年每月的天数,如果是润年2月要多1天
int i;
int days = 0;
// 计算年份中的天数
for(i=1; i<year; i++)
{
if(leapYear(i)) // 此处犯了个大错,估计和你一样,leapYear(i)写成leapYear(year)了
days += 366;
else
days += 365;
}
// 计算月份中的天数
for(i=0; i<month-1; i++)
{
if (leapYear(year) && (i+1 == 2)) // 当前年份是润年,且是2月,则加1天
days += mday + 1;
else
days += mday;
}
// 加上当月中的天数
days += day;
return days;
}
//润年 1、能整除4且不能整除1002、能整除4, 能整除100, 又能整除400
int leapYear(int y)
{
if (y%4==0) //1和2: 能整除4
{
if(y%100==0)//2: 能整除100
{
if(y%400==0)//2: 能整除400
{
return 1;
}
else
{
return 0;
}
}
else//1: 不能整除100
{
return 1;
}
}
else
{
return 0;
}
}
本帖最后由 jackz007 于 2019-5-29 08:48 编辑
说到计算自公元1年1月1日起所经历的天数,楼主还需要补充新的知识点,否则,永远也无法计算正确。
我们现在所采用的历法叫格里历,这个历法规定,平年 365 天,闰年 366 天,每 4 年 1 闰,但整 100 年不闰,整 400 年才闰,每 400 年为 97 闰 。格里历自 1582 年 的 10 月 15 日起正式启用,而这个日期之前所采用的历法叫儒略历,儒略历规定的平闰年天数与格里历一致,所不同的是,计算闰年的规则是每 4 年为 1 闰,每 100 年为 25 闰,每 400 年为 100 闰。儒略历的废止日期是1582 年 10 月 4 日。如果足够细心就会发现,儒略历的最后一天(1582 年 10 月 4 日)到格里历的第一天(1582 年 10 月 15 日)间隔了 10 天,那么,这 10 天究竟去哪里了呢?答案是根本就不存在,用来弥补和修正之前因历法不准确所带来的误差。就是说,1582 年 10 月 4 日的次日就是 1582 年 10 月 15 日,或者可以换句话说,1582 年 10 月 5 ~ 14 日在历史上根本就没有存在过! ba21 发表于 2019-5-28 23:52
注意注释中的
// 此处犯了个大错,估计和你一样,leapYear(i)写成leapYear(year)了
毛瑟顿开~~,非常谢谢!
明白了。
1,从出生年份往公元元年开始遍历闰年,故直接写了year, 感觉很自然~~!实际上是遍历i,就是从1到出生那年的年份中的闰年数。
2,月份那里自己也多加了,比如3月10日,把day,day,day都加上再加10天,实际是不应该加day. jackz007 发表于 2019-5-29 08:07
说到计算自公元1年1月1日起所经历的天数,楼主还需要补充新的知识点,否则,永远也无法计算正确。
...
谢谢普及知识{:5_109:}。我有点想当然了,把公元元年设为原点。
话说,如何公元年历如何对应中国古代? 比如公元149年,是东汉建安3年? andypete 发表于 2019-5-29 09:36
毛瑟顿开~~,非常谢谢!
明白了。
1,从出生年份往公元元年开始遍历闰年,故直接写了year, 感觉很自然~ ...
{:10_275:}
页:
[1]