题目略
闰年和平年
闰年2月29天一年366天,平年2月28天一年365天,每四年到一次闰年。
闰年算法:
能被4整除不能被100整除
能被400整除的
一.预备知识
今天重点是复习闰年的算法,以及新东西。
1.笨拙法
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int yr;
cin>>yr;
if((yr%4==0&&yr%100!=0)||(yr%400==0)) cout<<"leap yr"<<endl;
else cout<<"not leap yr"<<endl;
return 0;
}
- 一种很神奇的办法(参考博客原文:https://blog.csdn.net/cccfire/article/details/79375552 )
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int yr;
cin>>yr;
if(((yr&3)==0)&&((yr%100)!=0||(yr%400)==0)) cout<<"leap yr"<<endl;
else cout<<"not leap yr"<<endl;
return 0;
}
解释:表达式(a&3)==(a%4)的值是1因为无论a的值为多少a&3的结果只保留a的最后2位如a的值为17,它变为二进制为10001,而3为00011,它们相与的结果只有a的1和2位数字保留下来也就是01,因为与1相与就保留原数据,与0相与就变0 如 a&1=a a&0=0而a%4也是保留a的最后2位,因为只有最后2位的值为3,小于4,其它都>4
PS:我也不知道什么时候可以用得着这个,,,有备无患吧,这个思路很别致
= =
/// — //
二.题目解析代码
#include<iostream>
#include<cmath>
using namespace std;
bool isleapyr(int yr)
{
return ((yr%4==0&yr%100!=0)||(yr%400==0));
}
int main()
{
int yr=1777,mth=4,d=30;
for(int i=0;i<8112;++i)///这里因为第一次出生日是第一天所以翻的时候是8113-1
{
d++;
if(mth==12&&d==32)///到12月且d=32已经到了来年
{
yr++;
mth=1;
d=1;
continue;
}
if((mth==1||mth==3||mth==5||mth==7||mth==8||mth==10)&&d==32)///这里加的是月份
{
mth++;
d=1;
continue;
}
if((mth==4||mth==6||mth==9||mth==11)&&d==31)///同上
{
mth++;
d=1;
continue;
}
if(mth==2&&isleapyr(yr)&&d==30)///leapyr 是29天,当d是30便到了下一个月
{
mth++;
d=1;
continue;
}
if(mth==2&&!isleapyr(yr)&&d==29)///not leapyr是28天,原理同上
{
mth++;
d=1;
continue;
}
}
cout<<yr<<"-"<<mth<<"-"<<d<<endl;
return 0;
}
/*这道题做完之后,可以吧i<5343-1,带入代码进行验证,可发现确实是1791-12-15
不过这道题是真的好费体力--
PS:可用excel app代劳哈哈哈哈(仰天长啸)*/