POJ2080 日期计算(1),模拟题,因为细节WA很久

1 题意,给出2000年1月1日后多少天,换算出年-月-日 星期几。

2 分析。

比较水的模拟题。编码能力有待提高,思维不够缜密,出了很多错,是很多。

注意题目要求输出的数,是有前导0的。

3

代码一

#include <iostream>
#include<stdio.h>
#include <string>
using namespace std;

int day;
int year;
int month;
int zhou;
int year_day[2]={365,366};
int run_year(int temp){
    if( (temp%4==0&&temp%100!=0) || (temp%400==0) ){
        return 1;
    }
    return 0;
}
int month_day[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31};
//int month_day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//ping nian
char week_name[13][20]={"Saturday","Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
int main()
{
    while(~scanf("%d",&day)&&day!=-1){ ///Note: day>0, (negleck day==0.)
        zhou=day%7;
        year=2000;
        month=1;
        day++;// buchang

        for(int i=2000;day>year_day[run_year(i)];i++){
            day-=year_day[run_year((i))];
            year=i+1;
        }

        for(int j=1;day>month_day[run_year(year)][j];j++){
            day-=month_day[run_year(year)][j];
            month=j+1;//Note: 注意month初始化,否则如果for内语句不执行,那么month将是随机数!
        }

        //cout<<year<<"-"<<(month<10?"0":"")<<month<<"-"<<(day<10?"0":"")<<day<<" "<<week_name[zhou]<<endl;
        printf("%d-%02d-%02d %s\n",year,month,day,week_name[zhou]);
    }
    return 0;
}


代码二:

#include <iostream>
#include<stdio.h>
#include <string>
using namespace std;

int day;
int year;
int month;
int zhou;
int kk[2]={365,366};
int run_year(int temp){
    if( (temp%4==0&&temp%100!=0) || (temp%400==0) ){
        return 1;
    }
    return 0;
}
int month_day[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31};
int month_[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//ping nian
char week_name[13][20]={"Saturday","Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
int main()
{

    while(~scanf("%d",&day)&&day!=-1){
        zhou=day%7;
        year=2000;
        month=1;
        day++;// buchang
        for(int i=2000;day>kk[run_year(i)];i++){
            day-=kk[run_year(i)];
            year=i+1;
        }

        for(int i=1;i<=12;i++){
            if(run_year(year)){
                if(i==2&&day>29){
                    day-=29;
                }
                else if(i!=2&&day>month_[i]){ /// 不要忽略i!=2. (否则,i==2,day==29,就会wa)
                    day-=month_[i];
                }
                else{
                    month=i;
                    break;
                }
            }
            else{
                if(day>month_[i]){
                    day-=month_[i];
                }
                else{
                    month=i;
                    break;
                }
            }
        }

        printf("%d-%02d-%02d %s\n",year,month,day,week_name[zhou]);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值