一步一步详解高斯日记
这是有一年的蓝桥杯的题目,感觉挺有趣的
意思就是高斯有个习惯,记日期的时候喜欢只用数字来记,比如如果你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);
}
还是挺有趣的不是,后面闰年的接着再写