日期的问题及相关代码(C语言)

日期的问题及相关代码(C语言)

以下包括的问题:

  1. 日期问题
  2. 第几天问题
  3. 不吉利日期
  4. 生日相同
  5. 生日蜡烛

一.闰年

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值