一步一步详解高斯日记

这是有一年的蓝桥杯的题目,感觉挺有趣的
意思就是高斯有个习惯,记日期的时候喜欢只用数字来记,比如如果你2001年一月一日出生的话,你活到2002年1
月一日,他就会写个366。大致意思就是你现在的时间减去个出生的时间+1就是这个数字。
那么我们有没有办法将这个数字转化为日期呢,比如告诉你这个数字是1000你能立刻告诉我是哪一年的几月几号吗?

高斯的生日是1777-4-30,天数8113,问这一天的日期

这题是填空题要我写肯定直接笔算,思路的话有两种,一种是以四年为一周期,然后将天数除以周期,取余数,再将余数除以一年的天数,求得日期
另一种就是直接忽略闰年,用天数除以一年,然后算这么多年里有多少闰年,然后减去闰年数,最后余数是一年中的第多少天,这样就好算了。
(值得注意的是算的时候记得先将天数减1,否则会多出一天,比如你今天出生,算明天的话,天数是二,这个时候你不能直接将你的出生日期加2算了,需要先减一再加,这个自己想想吧,弄懂了它的意思再类比一下就轻松多了。)

我们先从简单的来好吧。
1、先忽略闰年,直接按一年365天算这样好了
2、加上闰年。(其实这题最难的就是区分闰年这个槛了)

一、只求一年之内某个数的具体日期(非闰年)

下面这个程序有点问题for循环里不是个变量,填32的话,二月等小月份输入的就是错的了。

#include<stdio.h>
main()
{
	int Day,i,a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	 Day=65;
	 for(i=0;Day>32;i++)
	 {
	 	Day=Day-a[i];
	 }
	 printf("%d-%d",i+1,Day);
}

后来想想,加上个a[i]就行了。

#include<stdio.h>
main()
{
	int Day,i,a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	 Day=60;
	 for(i=0;Day>a[i];i++)
	 {
	 	Day=Day-a[i];
	 }
	 printf("%d-%d",i+1,Day);
}

在这里插入图片描述
这里先填固定日期,不想让程序复杂化。
其实这个程序核心最有趣的地方就是利用了数组。

我想了下有没有办法反转一下呢,输入日期可以获得这是这一年的第多少天(非闰年)
在这里插入图片描述

#include<stdio.h>
main()
{
	int Day,i,j,a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	  printf("请输入现在的月份:\n");
	  scanf("%d",&j);
	   printf("请输入今天是几号:\n");
	   scanf("%d",&Day);
	 for(i=0;i<j-1;i++)
	 {
	 	Day=Day+a[i];
	 }
	 printf("这是今年的第%d天",Day);
}

还是挺有趣的不是,后面闰年的接着再写

猜你喜欢

转载自blog.csdn.net/weixin_43560272/article/details/89198480