C语言简单应用实例:有这样的日期吗?(多测例版数组or函数)

C语言简单应用实例:有这样的日期吗?(多测例版数组or函数)

题目来源:链接: 有这样的日期吗?.

如图
输入
每行有三个小于10000的正整数y,m,d,表示一个日期的年月日。

输出
如果该日期是合乎历法的则输出yes,否则输出no。

输入样例:

 2000 2 29
 2001 6 31
 2001 12 31
 2001 11 31
 20000 2 21  

输出样例:

no
no
yes
no
no

解析:主要在于闰年,大小月(7、8月变换),二月的处理。

** 闰年规则:四年一闰,百年不闰,四百年再闰链接。例如:2000年是闰年,2100年则是平年

处理

对于年year,月month,日day;
先判断年,月,日单个是否合法
然后对把y除4取余赋值给a:a=y%4;
把月份m除2取余赋值给c: c=m%2;
因为m在7、8月有变化,相当于跨了一个月,
于是我用:if(m>=8){c=(c+1)%2;}来处理c
则if(m==2)(解决2月的特殊情况),else if 解决其他月份。

注:m>8月的处理应该在其他月份处理之前就要做。

运用函数:
如下:

二月特殊情况:

if(y>0&&y<=10000&&m>0&&m<=12&&d>0&&d<=31)
	{
		if(m>=8){c=(c+1)%2;}
		if(m==2){
		if(a==0){
		a=y%400,b=y%100;
		if(a!=0&&b==0&&d>=29){return 0;}
		else {if(d<=29){return 1;}else{return 0;}}
		}else if(d<29) {return 1;}else{return 0;}
		}

其他月份:

   	 else if(c==0)  {if(d<=30) return 1;else return 0;}
   	 else if(c==1)  {if(d<=31) return 1;else return 0;}
   }else
   return 0;
}

完整的函数为:

int judge(int y,int m,int d){
	int a,b,c;
	a=y%4;
	c=m%2;
	if(y>0&&y<=10000&&m>0&&m<=12&&d>0&&d<=31)
	{
		if(m>=8){c=(c+1)%2;}
		
		if(m==2){
		if(a==0){
		a=y%400,b=y%100;
		if(a!=0&&b==0&&d>=29){return 0;}
		else {if(d<=29){return 1;}else{return 0;}}
		}else if(d<29) {return 1;}else{return 0;}
		}
		 else if(c==0)  {if(d<=30) return 1;else return 0;}
		 else if(c==1)  {if(d<=31) return 1;else return 0;}
	}else
	return 0;
	return 0;
}

将函数返回值返回给main函数

int main(){
	int k;
	scanf("%d",&k);
	int n[k];
	
	for(int i=0;i<k;i++){
		int y,m,d;
		scanf("%d %d %d",&y,&m,&d);
		n[i]=judge(y,m,d);     
	}
	for(int i=0;i<k;i++){
		if(n[i]==0){printf("no\n");}
		else	   
		{printf("yes\n");}
	}
	return 0;
}

**最完善 **

#include <stdio.h>
#include<math.h>
int judge(int y,int m,int d){
	int a,b,c;
	a=y%4;
	c=m%2;
	if(y>0&&y<=10000&&m>0&&m<=12&&d>0&&d<=31)
	{
		if(m>=8){c=(c+1)%2;}
		
		if(m==2){
		if(a==0){
		a=y%400,b=y%100;
		if(a!=0&&b==0&&d>=29){return 0;}
		else {if(d<=29){return 1;}else{return 0;}}
		}else if(d<29) {return 1;}else{return 0;}
		}
		 else if(c==0)  {if(d<=30) return 1;else return 0;}
		 else if(c==1)  {if(d<=31) return 1;else return 0;}
	}else
	return 0;
	return 0;
}
int main(){
	int k;
	scanf("%d",&k);
	int n[k];
	
	for(int i=0;i<k;i++){
		int y,m,d;
		scanf("%d %d %d",&y,&m,&d);
		n[i]=judge(y,m,d);     
	}
	for(int i=0;i<k;i++){
		if(n[i]==0){printf("no\n");}
		else	   
		{printf("yes\n");}
	}
	return 0;
}

以上就是全部内容,感谢观看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值