C语言编写程序计算某年某月某日是该年中的第几天(3种方法)

C语言编写程序计算某年某月某日是该年中的第几天

编写程序计算某年某月某日是该年中的第几天
例如输入fool girl 的出生日期1999-5-27
输出147

闰年条件

判断一个年份是否为闰年,通常有以下三个条件:

  1. 如果该年份能够被400整除,则是闰年。
  2. 如果该年份能够被4整除但不能被100整除,则也是闰年。
  3. 其他情况则不是闰年。

其中,第一个条件是根据闰年的定义来判断的,即每四年一闰,但是每百年不闰,每四百年再闰。因此,能被400整除的年份必然是闰年。

第二个条件则是对第一个条件的补充,因为能被4整除但不能被100整除的年份也是闰年。例如,2000年就是一个能被400整除的年份,是闰年;而1900年虽然能被4整除,但是也能被100整除,因此不是闰年。

第三个条件则是其他情况,即不能被4整除、或者能被100整除但不能被400整除的年份都不是闰年。

第一种switch语句代码实现

int year,month,day,sum=0,i;
scanf("%d-%d-%d",&year,&month,&day);
//如果是1月,直接输出day就行
if(month==1)
    printf("%d ",day);
else{
    for(i=1;i<month;i++){
        switch(i){
            case 1:case 3:case 5:case 7:case 8:case 10:case 12:
                sum+=31;
                break;
            case 4:case 6:case 9:case 11:
                sum+=30;
                break;
            case 2:sum+=28;
        }
    }
    sum+=day;                  
    //如果是闰年,3月之后的都需要+1
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        if (month > 2) {
            sum += 1;
        }
    }
    printf("%d ",sum);
}

第2种(将之前的月天数直接给出)

int year, month, day,sum=0;
scanf("%d-%d-%d",&year,&month,&day);
switch(month)
{
    case 1: sum=0; break;
    case 2: sum=31; break;
    case 3: sum=59; break;
    case 4: sum=90; break;
    case 5: sum=120; break;
    case 6: sum=151; break;
    case 7: sum=181; break;
    case 8: sum=212; break;
    case 9: sum=243; break;
    case 10: sum=273; break;
    case 11: sum=304; break;
    case 12: sum=334; break;
}
sum+=day;                  
//如果是闰年,3月之后的都需要+1
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
    if (month > 2) {
        sum += 1;
    }
}
printf("%d",sum);

第3种最简方法(纯属个人认为)

//数组下标和月份一一对应,内容为对应月份的天数
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},year,month,day,sum=0,i;

scanf("%d-%d-%d",&year,&month,&day);

//将day存放到a[0]的位置,方便后续统计,如果是闰年,需要将2月份改为29天
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
    a[0]=day;
    a[2]=29;
}else{
    a[0]=day;
}       

//因为a[0]存放的是day,所以就可以直接从a[0]遍历相加
for(i=0;i<month;i++){
    sum+=a[i];
}

printf("%d ",sum);
第3种运算实例

在这里插入图片描述

第3种扩展方法(总天数倒着减)

int year,month,day,sum=365,i,a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

scanf("%d-%d-%d",&year,&month,&day);

//闰年
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
 a[2]=29;
 sum=366;
}

//从12月份开始往前减
for(i=12;i>month;i--){
    sum-=a[i];
}    

//天数减去该月的天数
printf("%d ",sum-a[month]+day);
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@赵士杰

如果对你有用,可以进行打赏,感

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值