这是有一年的蓝桥杯的题目,感觉挺有趣的
意思就是高斯有个习惯,记日期的时候喜欢只用数字来记,比如如果你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);
}
还是挺有趣的不是,后面闰年的接着再写
二、以1年1月1日为出生日加入区分闰年方法
#include<stdio.h>
main()
{
int Day,i,j,k,a[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,
31,29,31,30,31,30,31,31,30,31,30,31};
j=0;
printf("以1年1月1日为出生日:\n");
printf("请输入你要输入的天数:\n");
scanf("%d",&Day);
for(i=0;Day>a[j][i];i++)
{
if(j%4==0&&j%100!=0||j%400==0)
{
j=0;
Day=Day-a[j][i];
}
else
{
j=1;
Day=Day-a[j][i];
}
}
k=i/12;
i=i%12;
printf("%d年-%d月-%d日",k+1,i+1,Day);
}
这个程序有个大问题,刚开始我没注意。把数字算大了才知道这个i的值是没有减周期的,它在循环里涨到24之后就不会继续涨了,不信你可以输入1000试试,后面的Day必定会是三位数
于是乎我又调试了好久终于搞好了!!!
#include<stdio.h>
main()
{
int Day,i,j,k,a[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,
31,29,31,30,31,30,31,31,30,31,30,31};
j=0;
k=0;
printf("以1年1月1日为出生日:\n");
printf("请输入你要输入的天数:\n");
scanf("%d",&Day); //输入你要的天数
for(i=0;Day>a[j][i];i++)
{
if(j%4==0&&j%100!=0||j%400==0)
{
j=0;
Day=Day-a[j][i];
}
else
{
j=1;
Day=Day-a[j][i];
}
if(i>11)
{
i=0;//这个i的值把我坑惨了,刚开始输入的是1,找了好长时间都没发现这个bug,就是调试的时候发现输入397时间不对,也不知道哪里不对!!!
k++;
}
}//for循环加if嵌套语句,两层嵌套,一个判断是否为闰年,一个保证i的循环在11以内
i=i%12;
printf("%d年-%d月-%d日",k+1,i+1,Day);
}
上面那个好像还是错的,回头改了,这个到1400多天就又错了,工程过于复杂,弃了。
#include<stdio.h>
main()
{
int Day,i,j,k,a[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,
31,29,31,30,31,30,31,31,30,31,30,31};
j=1;
k=0;
printf("以1年1月1日为出生日:\n");
printf("请输入你要输入的天数:\n");
scanf("%d",&Day); //输入你要的天数
for(i=0;Day>a[j][i];i++)
{
j=Day/365+1;
if(j%4==0&&j%100!=0||j%400==0)
{
j=1;
Day=Day-a[j][i];
}
else
{
j=0;
Day=Day-a[j][i];
}
if(i>11)
{
i=0;//这个i的值把我坑惨了,刚开始输入的是1,找了好长时间都没发现这个bug,就是调试的时候发现输入397时间不对,也不知道哪里不对!!!
k++;
}
}//for循环加if嵌套语句,两层嵌套,一个判断是否为闰年,一个保证i的循环在11以内
i=i%12;
printf("%d年-%d月-%d日",k+1,i+1,Day);
}
三、输入出生日,给定天数(距离元年一月一号),判断年月日。
#include<stdio.h>
main()
{
int j,i,k,y,Day=0,Day1=0,Day2=0,a[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,
31,29,31,30,31,30,31,31,30,31,30,31};
printf("请输入年数:");
scanf("%d",&j);
printf("请输入月数");
scanf("%d",&y);
printf("请输入天数");
scanf("%d",&Day2);
for(;j>1;j--)
{
if(j%4==0&&j%100!=0||j%400==0)
{
k=1;
}
else
{
k=0;
}
for(i=0;i<12;i++)
{
Day=Day+a[k][i];
}
}
for(y=y-2;y>=0;y--)
{
if(j%4==0&&j%100!=0||j%400==0)
{
k=1;
}
else
{
k=0;
}
Day1=Day1+a[k][y];
}
Day=Day+Day1+Day2;
printf("%d",Day);
}
差不多可以了,头都转晕了,怪自己当时没把轮廓图画好,搞得bug百出,头疼!!!不能深陷进去了,没能完成说明我底子不够,等把基本功练够了,隔个半年再回来做吧!!!这个先放弃吧!!!
陷进去之后整个人都陷入debug深渊中,不能自拔,程序员太苦命了。所以刚开始的策划真的很重要,要不然像我这样后面就烂尾了!