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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章