Num 8 : 一年之中的第几天的问题( 闰年 )


    问题如题;


    刚一开始的时候想到的就是用 switch 函数,从一月开始,到十二月;

    写完代码,发现计算量不小,需要计算每一种情况下的天数,而且还需要分闰年的情况,break 函数也是写到手疼;


    一开始的代码:

<span style="font-size:14px;">#include <stdio.h>
#include <process.h>
int main()
{
    int y,m,d,days,flag;
    flag=0;
    scanf("%d%d%d",&y,&m,&d);
    if(y%400==0||y%4==0&&y%100!=0)
        flag=1;
    if (m<1||m>12)
    {
        printf("输入月份有错\n");
    }
    else
    {
        if (!flag&&m==2&&(d<1||d>28))
        {
            printf("输入日期有错\n");}
        if (flag&&m==2&&(d<1||d>29))
        {
            printf("输入日期有错\n");}
        if ((m==4||m==9||m==11)&&(d<1||d>30))
        {
            printf("输入日期有错\n");}
        if ((m==1||m==3||m==5||m==7||m==8||m==10)&&(d<1||d>31))
        {
            printf("输入日期有错\n");}
        switch(m)
        {
        case 1:days=0;break;
        case 2:days=31;break;
        case 3:days=31+28;break;
        case 4:days=31+28+31;break;
        case 5:days=31+28+31+30;break;
        case 6:days=31+28+31+30+31;break;
        case 7:days=31+28+31+30+31+30;break;
        case 8:days=31+28+31+30+31+30+31;break;
        case 9:days=31+28+31+30+31+30+31+31;break;
        case 10:days=31+28+31+30+31+30+31+31+30;break;
        case 11:days=31+28+31+30+31+30+31+31+30+31;break;
        case 12:days=31+28+31+30+31+30+31+31+30+31+30;break;
        };
        days=days+d;
        if (m>2)
            days=days+flag;
        printf("%d",days);
    }
    return 0;
}</span>

看起来虽然整齐,但浪费时间;

后来在百度上看到了更好的方法:


#include<stdio.h>
#include<string.h>
int isRunNian(int year)
{
	if(year%100==0)
	{
		if(year%400==0) return 1;
		else return 0;
	}	
	else if(year%4==0) return 1;
	else return 0;
}
int main()
{
	int year, month, day, total;
	scanf("%d%d%d",&year,&month,&day);
	total = 0;
	for(int i = 1; i < month; i++)
	{ 	//step1
		if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
		{
			total += 31;	
		} 
		else if (i == 4 || i ==6 || i == 9 || i==11)
		{
			total += 30;
		} else if(i == 2){
			if(isRunNian(year)){
				total += 29;
			} else {
				total += 28;
			}	
		}
	}
	total += day;			//step2
	printf("%d\n", total);		//step3
      return 0;	
}

将每月三十一天的,每月三十天的和二月分开,并在二月时判断闰年;

给出闰年函数;


说明在一定情况下,for 语句和 switch 语句可互换;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值