UVA150 日期计算(4) 新历和旧历的第一天不是同一天

1 题意

输入一个日期,判断是旧历还是新历,转换成另一个历法的日期并输出,如果输出旧历,加一个*。

2分析

①特别注意!新历和旧历的第一天不是同一天!所以旧历比新历提前两天开始。。。【这一点要具体看题目以及题目给出的测试数据是怎么说的了。】

②变量较多,注意变量名不要用错,特别是对变量的值进行操作,或者是输出时。

③结束输入的判断。

char str[10]; 

错误:   while(~scanf("%s",str)&&str!="#") 或者 if(str=="#") break;  ///都不能结束输入!

正确:   if(strcmp(str,"#")==0) break;

④判断周几

新历:week_name[sumday%7],week_name[0]=周日、week_name[1]=周一...

旧历:week_name[(sumday+5)%7],week_nam[0]=周日、week_name[1]=周一...

3

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

int year_day[2]={365,366};
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};
char week_name[7][10]={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};  ;
char month_name[13][10]={"","January", "February", "March", "April", "May", "June", "July", "August", "September", "October","November","December"};
int month,day,week,year,sumday,old;
int month_2,day_2,week_2,year_2;
int old_run(int year_temp){
    return (year_temp%4==0)?1:0;
}
int new_run(int year_temp){
    return ((year_temp%4==0&&year_temp%100!=0)||(year_temp%400==0))?1:0;
}
void Cal_sumday_old(){
    sumday=0;
    for(int i=1;i<year;i++){
        sumday+=year_day[old_run(i)];
    }
    for(int i=1;i<month;i++){
        sumday+=month_day[old_run(year)][i];
    }
    sumday+=day;
}
void Cal_sumday(){
    sumday=0;
    for(int i=1;i<year;i++){
        sumday+=year_day[new_run(i)];
    }
    for(int i=1;i<month;i++){
        sumday+=month_day[new_run(year)][i];
    }
    sumday+=day;
    if(sumday%7==week){
        old=0;
    }
    else{
        old=1;
        Cal_sumday_old();
    }
}
void Change_old(){
    sumday+=2;
    year_2=month_2=day_2=1;
    week_2=(sumday+5)%7;
    for(int i=1;sumday>year_day[old_run(i)];i++){
        sumday-=year_day[old_run(i)];
        year_2=i+1;
    }

    for(int i=1;sumday>month_day[old_run(year_2)][i];i++){
        sumday-=month_day[old_run(year_2)][i];
        month_2=i+1;
    }
    day_2=sumday;
}
void Change_new(){
    sumday-=2;
    year_2=month_2=day_2=1;
    week_2=(sumday)%7;
    for(int i=1;sumday>year_day[new_run(i)];i++){
        sumday-=year_day[new_run(i)];
        year_2=i+1;
    }
    for(int i=1;sumday>month_day[new_run(year_2)][i];i++){
        sumday-=month_day[new_run(year_2)][i];
        month_2=i+1;
    }
    day_2=sumday;
}
void Print(){
    printf("%s %d",week_name[week_2],day_2);
    if(!old) printf("*");
    printf(" %s %d\n",month_name[month_2],year_2);
}
int main()
{
    //freopen("out.txt","w",stdout);
    char str_week[10],str_month[10];
    while(~scanf("%s",str_week)){
        if(strcmp(str_week,"#")==0) break;
        scanf("%d%s%d",&day,str_month,&year);
        for(int i=0;i<7;i++){
            if(strcmp(week_name[i],str_week)==0){
                week=i;break;
            }
        }
        for(int i=1;i<=12;i++){
            if(strcmp(month_name[i],str_month)==0){
                month=i;break;
            }
        }
        old=0;
        Cal_sumday();
        if(old==1){//转换为  新历
            Change_new();
        }
        else if(old==0){//转换为  旧历
            Change_old();
        }
        Print();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值