第三题 输入年月日求时间差

来源:互联网 发布:成都cnc编程最新招聘 编辑:程序博客网 时间:2024/05/11 02:44

p15面


打表法就是无冲突的hash表

int buf[32][13][5001];以后定义这么大的数组一定不能在main函数里面定义,

定义为全局变量或者用malloc开辟内存

这一题需要注意的地方是!!

1.方法很新颖,需要多练

2.习惯下标从1开始就必须把数组的长度多一个!不然就习惯从0开始少一个!



//见证scanf的真正实力吧 scanf可以读取特定位数的int型输入%4d表示四位



#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#define leap(x) (((x%4==0)&&x%100!=0)|| x%400==0)?1:0


using namespace std;


int dayinm[13][2]
{0,0,31,31,28,29,31,31,30,30,31,31,30,30,31,31,31,31,30,30,31,31,30,30,31,31};//这里下标要匹配,特别是int dayinm[0]要十分注意



struct date{
    int day;
    int mon;
    int year;
    void next()
    {
        day++;
        if(day>dayinm[mon][leap(year)])
        {
            day=1;
            mon++;
            if(mon>12)
            {
                year++;
                mon=1;
            }
        }
    }
};


int buf[32][13][5001];


int main(){
    date tmp;  //设置中间变量计算每一个年月日对应的cnt
    tmp.day = 1;
    tmp.mon = 1;
    tmp.year=0;
    int cnt=0; //cnt就是每一天与0年1月1日之差的天数


    while(tmp.year<5000)
    {
        buf[tmp.day][tmp.mon][tmp.year]=cnt;
        cnt++;
        tmp.next();




    }
    date d1,d2;
    while(scanf("%4d%2d%2d",&d1.year,&d1.mon,&d1.day)&&scanf("%4d%2d%2d",&d2.year,&d2.mon,&d2.day)!=EOF)
    {
        cout<<abs(buf[d1.day][d1.mon][d1.year]-buf[d2.day][d2.mon][d2.year])+1<<endl;
    }


    return 0;
}

原创粉丝点击