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;
}
以上就是全部内容,感谢观看。