2013-1-1高斯日记

题目略

闰年和平年

闰年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;
}
  1. 一种很神奇的办法(参考博客原文: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代劳哈哈哈哈(仰天长啸)*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值