鱼C论坛

 找回密码
 立即注册
查看: 1425|回复: 5

[已解决]计算活了多少天的问题

[复制链接]
发表于 2019-5-28 21:24:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位老师,求助!!弄半天了~~总是计算不对,感觉方法是对的,求助求助~~!
想法是:
求出出生当年的年份到公元1年1月1日的天数,比如2000年,那么天数就是2000减去1,闰年就366,平年就365,循环加起来;
求出出生当年的月份,比如3月,那么就遍历数组day[0],day[1],day[2] 加起来,再加上出生日期那天,若是闰年则加多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 int  sum1= 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[i];
        }
       
                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[i];
        }
       
                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;

}
最佳答案
2019-5-28 23:52:53
注意注释中的
// 此处犯了个大错,估计和你一样,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[i] + 1;
                else
                        days += mday[i];
        }

        // 加上当月中的天数
        days += day;


        return days;
}


//润年 1、能整除4且不能整除100  2、能整除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;
        }
}
結果.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-28 23:52:53 | 显示全部楼层    本楼为最佳答案   
注意注释中的
// 此处犯了个大错,估计和你一样,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[i] + 1;
                else
                        days += mday[i];
        }

        // 加上当月中的天数
        days += day;


        return days;
}


//润年 1、能整除4且不能整除100  2、能整除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;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-29 08:07:59 From FishC Mobile | 显示全部楼层
本帖最后由 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 日在历史上根本就没有存在过!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-29 09:36:11 | 显示全部楼层
ba21 发表于 2019-5-28 23:52
注意注释中的
// 此处犯了个大错,估计和你一样,leapYear(i)写成leapYear(year)了

毛瑟顿开~~,非常谢谢!
明白了。
1,从出生年份往公元元年开始遍历闰年,故直接写了year, 感觉很自然~~!实际上是遍历i,就是从1到出生那年的年份中的闰年数。
2,月份那里自己也多加了,比如3月10日,把day[0],day[1],day[2]都加上再加10天,实际是不应该加day[2].
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-29 09:38:31 | 显示全部楼层
jackz007 发表于 2019-5-29 08:07
说到计算自公元1年1月1日起所经历的天数,楼主还需要补充新的知识点,否则,永远也无法计算正确。
  ...

谢谢普及知识。我有点想当然了,把公元元年设为原点。
话说,如何公元年历如何对应中国古代? 比如公元149年,是东汉建安3年?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-29 09:39:13 | 显示全部楼层
andypete 发表于 2019-5-29 09:36
毛瑟顿开~~,非常谢谢!
明白了。
1,从出生年份往公元元年开始遍历闰年,故直接写了year, 感觉很自然~ ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 19:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表