一步一步详解高斯日记

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值