T156530 儒略历-传智杯-练习赛

知道的越多,不知道的越多(微信:Y17744650906)
点赞再看,养成习惯
T156530 儒略历

在 1582 年之前,以 4 为倍数的年份为闰年。正常情况下,一年中一月到十二月的天数分别是 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 天。如果这年是闰年,那么二月则有 29 天。
但某位皇帝发现这么做其实不够准确,会造成误差,因此规定从 1582 年开始,以 4 为倍数的年份,除了以 100 为倍数且不为 400 的倍数年份,才是闰年。同时为了消除误差,规定 1582 年 10 月 4 日的下一天是 1582 年 10 月 15 日,中间的日期就当作不存在了。
现在给出日期,计算这个日期到公元 1 年 1 月 1 日经过的天数。

输入格式:
按照 日月年 的格式输入数据,其中日是 1 到 31 之间的整数,月是三个大写字母,年是 1 到 9999 之间的整数。保证这个日期是合法且存在的。
月份的大写字母:
1月:JAN
2月:FEB
3月:MAR
4月:APR
5月:MAY
6月:JUN
7月:JUL
8月:AUG
9月:SEP
10月:OCT
11月:NOV
12月:DEC

输出格式:
按照输入的顺序输出中奖名单,每个昵称占一行。如果没有人中奖,则输出 Keep going…。

输出一个整数表示答案
#include<iostream>
#include<stdio.h>
#include<cctype>
#include<string.h>
using namespace std;
int main(){
	string in,mon;
	string mons[13]={"lin","JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"};
	cin>>in;
	int day=0,year=0,i,j;
	int is1 = 1,is2 = 0;
	for(i=0;i<in.length();i++){
		if(isdigit(in[i]) && is1){
			day = day * 10 + (in[i] - '0');
		}else{
			is1 = 0;
			is2 = 1;
		}
		if(isalpha(in[i])){
			mon += in[i];
		}
		if(is2 && isdigit(in[i])){
			year = year * 10 + (in[i] - '0');
		}
	}
	int mou = 0;
	for(i=1;i<13;i++){
		if(mons[i] == mon){
			mou = i;
			break;
		}
	}
	int ans = 0,is2y;
	if(year < 1582){
		for(i=1;i<year;i++){
			if(i % 4 == 0){
				ans += 366;	
			}else{
				ans += 365;
			}
		}
		if(year % 4 == 0 && mou >= 2){
			is2y = 29;
		}
		else{
			is2y = 28;
		}
		for(i=1;i<mou;i++){
			if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12){
				ans += 31; 
			}
			else if(i == 2){
				ans += is2y;
			}else{
				ans += 30;
			}
		}
		ans += day;
	}
	else if(year == 1582){
		for(i=1;i<year;i++){
			if(i % 4 == 0){
				ans += 366;	
			}else{
				ans += 365;
			}
		}
		if(mou < 10){
			for(i=1;i<mou;i++){
				if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12){
					ans += 31; 
				}
				else if(i == 2){
					ans += 28;
				}else{
					ans += 30;
				}
			}
			ans += day;
		}else if(mou == 10){
			for(i=1;i<mou;i++){
				if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12){
					ans += 31; 
				}
				else if(i == 2){
					ans += 28;
				}else{
					ans += 30;
				}
			}
			if(day <= 4){
				ans += day;
			}else{
				ans += (day -10);
			}
		}else{
			for(i=1;i<mou;i++){
				if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12){
					ans += 31; 
				}
				else if(i == 2){
					ans += 28;
				}else{
					ans += 30;
				}		
			}
			ans += day - 10;
		}
	}else{
		for(i=1;i<=1582;i++){
			if(i % 4 == 0){
				ans += 366;	
			}else{
				ans += 365;
			}
		}
		ans -= 10;
		for(i=1583;i<year;i++){
			if((i%4== 0 && i%100!=0 )|| i%400==0){
				ans += 366;	
			}else{
				ans += 365;
			}
		}
		if(((i%4== 0 && i%100!=0 )|| i%400==0) && mou >= 2){
			is2y = 29;
		}
		else{
			is2y = 28;
		}
		for(i=1;i<mou;i++){
			if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12){
				ans += 31; 
			}
			else if(i == 2){
				ans += is2y;
			}else{
				ans += 30;
			}
		}
		ans += day;
	}
	cout<<ans-1;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坏孩子充电自习室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值