这是有一年的蓝桥杯的题目,感觉挺有趣的
意思就是高斯有个习惯,记日期的时候喜欢只用数字来记,比如如果你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深渊中,不能自拔,程序员太苦命了。所以刚开始的策划真的很重要,要不然像我这样后面就烂尾了!