A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© AngleMGG 中级黑马   /  2014-9-22 23:52  /  1875 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


//输入2000年01月01日后的某一天,求出当天距2000.1.1的总天数,涉及闰年问题

#include <stdio.h>

int main()
{
        void Count();

        Count();       

        return 0;
}

void Count()
{
        int year;
    int month;
    int day;
    int count;//总天数
    int y = 0;//闰年数
    int n = 0;//大月
    int m = 0;//小月
    int s = 0;//闰月

    printf("请输入年 月 日\n");
    scanf("%d,%d,%d",&year,&month,&day);

    //求闰年数y
    for (int i=2000; i<year; i++)
    {
        if (((i%4==0)&&(i%100!=0))||(i%400==0))
        {
            y++;
        }
    }

    //分别求大月n和小月m
    for (int i=1;i<month;i++)
    {
        switch (i)
        {
            case 2:
                if (((year%4==0)&&(year%100!=0))||(year%400==0))
                {
                    s++;
                }
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                m++;
                break;
            default:
                n++;
                break;
        }
    }

    //算出总天数
    count = (year-2000)*355 + y + n*31 + m*30 + s*29 + day ;

    printf("%d\n",count);

}

就是这么简单的一题都需要考虑很多问题,有木有更简洁的实现呢:lol

9 个回复

倒序浏览
木有大虾给点建议吗
回复 使用道具 举报
年份的话计算(year-2000)/4的值吧,月份打表更快,天数就。。。
回复 使用道具 举报
补充:月份打表注意闰年,干脆打两个表吧。
回复 使用道具 举报
先判断年份是不是瑞年 然后在编写天数求解
回复 使用道具 举报
可以收藏!
回复 使用道具 举报
yl82846094 来自手机 中级黑马 2014-9-23 21:29:49
7#
看看!!!!
回复 使用道具 举报
我会这么写:

  1. void dateIncrease(int *year , int *month , int *day)
  2. {
  3.         int daysInMonth;
  4.         (*day)++;
  5.         switch(*month)
  6.         {
  7.         case 1:
  8.         case 3:
  9.         case 5:
  10.         case 7:
  11.         case 8:
  12.         case 10:
  13.         case 12:
  14.                 daysInMonth = 31;
  15.                 break;
  16.         case 4:
  17.         case 6:
  18.         case 9:
  19.         case 11:
  20.                 daysInMonth = 30;
  21.                 break;
  22.         case 2:
  23.                 if ( ((*year)%4 == 0 && (*year%100) != 0) || (*year)%400 == 0)
  24.                         daysInMonth = 29;
  25.                 else
  26.                         daysInMonth = 28;
  27.                 break;
  28.         }
  29.         if ((*day) > daysInMonth)
  30.         {
  31.                 *day = 1;
  32.                 (*month)++;
  33.         }
  34.         if ((*month) > 12)
  35.         {
  36.                 *month = 1;
  37.                 (*year)++;
  38.         }
  39. }

  40. void main()
  41. {
  42.         int cnt = 0;
  43.         int year = 2000 , month = 1 , day = 1;
  44.         int newYear , newMonth , newDay;
  45.         printf("input a date:");
  46.         scanf("%d%d%d" , &newYear , &newMonth , &newDay);
  47.         while (1)
  48.         {
  49.                 if (newYear == year && newMonth == month && newDay == day)
  50.                         break;
  51.                 dateIncrease(&year , &month , &day);//如果要计算任意两个日期的话,两个日期进行比较,时间较早的那个日期作为此函数的参数
  52.                 cnt++;
  53.         }
  54.         printf("there are %d days between the date %d, %d, %d and the date %d, %d, %d\n" , cnt , year , month , day , newYear , newMonth , newDay);
  55. }
复制代码
回复 使用道具 举报 1 0

没有注释,看了好久才明白,你的方法是一天天的加起来。又学会了一种方法,谢了
回复 使用道具 举报
AngleMGG 发表于 2014-9-24 11:52
没有注释,看了好久才明白,你的方法是一天天的加起来。又学会了一种方法,谢了 ...

对啊,日期每次增加1天,循环里面记数cnt也增加1,判断两个日期是否相同就可以了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马