日期的问题及相关代码(C语言)
以下包括的问题:
- 日期问题
- 第几天问题
- 不吉利日期
- 生日相同
- 生日蜡烛
一.闰年
1.闰年的知识
通闰年:公历年份是4的倍数的,且不是100的倍数,为闰年。(如2004年就是闰年);
世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年);
平年28天、闰年29天
2.判断是否是闰年的代码如下:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
if(((n%4==0)&&(n%100!=0))||(n%400==0))
//是4的倍数而不是100的倍数,或者是400的倍数
printf("闰年");
else
printf("不是闰年");
}
附上蓝桥杯的日期问题,里面含有判断闰年的问题
----蓝桥杯日期问题题解
二.第几天问题
例如蓝桥杯那道第几天的日期问题一样,我们可以先定义一个一维数组,然后通过判断闰年还是平年确定每个月的时间
1.题目
2000年的1月1日,是那一年的第1天。
那么,2000年的5月4日,是那一年的第几天?
2.代码
代码如下:(该代码可以通用判断第几天)
//从2000.1.1算第一天
#include<stdio.h>
int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int year,month,day;
scanf("%d%d%d",&year,&month,&day);
if(((year%4==0)&&(year%100!=0))||year%400==0)
days[2]=29;
//假如是闰年,第二月29天
int a=0;
for(int i=2000;i<=year;i++)
{
for(int j=1;j<month;j++)
{
a+=days[j];
}
}
a+=day;
printf("%d",a);
return 0;
}
三.不吉利日期
1.题目
在国外,每月的13号和每周的星期5都是不吉利的。特别是当13号那天恰好是星期5时,更不吉利。已知某年的一月一日是星期w,并且这一年一定不是闰年,求出这一年所有13号那天是星期5的月份,按从小到大的顺序输出月份数字。(w=1…7)
2.输入与输出
输入:
输入有一行,即一月一日星期几(w)。(1 <= w <= 7)
输出:
输出有一到多行,每行一个月份,表示该月的13日是星期五
样例输入:
7
样例输出:
1
10
3.代码
#include<stdio.h>
int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int day,a;
scanf("%d",&day);
for(int j=1;j<=12;j++)
{
if((day+12)%7==5)
printf("%d\n",j);
//判断每个月的13号是不是星期五
//day在此处代表每个月一号
//所以只需要+12天就是13号
day=day+days[j];
//下一个月
}
return 0;
}
四.生日,年龄问题
1.生日相同
(1)题目
在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的学号,出生月日。试找出所有生日相同的学生。
(2)输入与输出
输入:
第一行为整数n,表示有n个学生,n<100。
此后每行包含一个字符串和两个整数,分别表示学生的学号(字符串长度小于10)和出生月(1<=m<=12)日(1<=d<=31)。
学号、月、日之间用一个空格分隔。
输出:
对每组生日相同的学生,输出一行,
其中前两个数字表示月和日,后面跟着所有在当天出生的学生的学号,数字、学号之间都用一个空格分隔。
对所有的输出,要求按日期从前到后的顺序输出。
对生日相同的学号,按输入的顺序输出。
样例输入:
5
00508192 3 2
00508153 4 5
00508172 3 2
00508023 4 5
00509122 4 5
样例输出:
3 2 00508192 00508172
4 5 00508153 00508023 00509122
(3)代码
#include<stdio.h>
#include<string.h>
struct node{
int a; //月;
int b; //日;
char c[20]; //学号;
}students[200];
//定义一个结构体,方便交换;
int n;
void swap(int i,int j)
{
students[0]=students[i];
students[i]=students[j];
students[j]=students[0];
}
//交换;
int main()
{
int num=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{//从1开始,把0用来交换;
scanf("%s",students[i].c);
scanf("%d%d",&students[i].a,&students[i].b);
for(int j=i;j>0;j--)
{
if(students[j].a<students[j-1].a)
{
swap(j-1,j);
}
if((students[j].a==students[j-1].a)
&&(students[j].b<students[j-1].b))
{
swap(j-1,j);
}
}//因为数值不带,所以使用插入排序;
//使队列有序,从小到大;
}
for(int i=2;i<=n;i++)
{
if((students[i].a==students[i-1].a)
&&(students[i].b==students[i-1].b))
{
num+=2;
if(num==2)
{//第一次输出该月日;
printf("%d %d %s %s",students[i-1].a,
students[i-1].b,students[i-1].c,
students[i].c);
}
else if(num>2)
//第三个或者三个以上生日日期相同的同学;
printf(" %s",students[i].c);
}
else
{
if(num>=2)
printf("\n");
num=0;
//记录清空,输出换行符;
//为下一次输出日月做准备;
}
}
return 0;
}
2.生日蜡烛
这是蓝桥杯省赛的题目–生日蜡烛
(1)题目
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。现在算起来,他一共吹熄了236根蜡烛。请问,他从多少岁开始过生日party的?请填写他开始过生日party的年龄数。注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
(2)代码
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i < 100; i++)
{ //采用枚举法
int j=i;
int sum=0;
//每次初始化sum和j;
while(sum<236)
{
sum+=j;
j++;
}
if (sum == 236)
{
printf("%d", i);
break;
}
//sum==236的时候输出,跳出循环;
}
return 0;
}