人类将要移民火星了,不过在移民前,需要了解火星的日历,火星也是有闰年和闰月的,火星历中的月份设计与置闰规则是这样的:
月份
一个火星年分为24个月,每6个月的最初5个月的长度为28火星日,其余为27火星日(也就是6月、12月、18月为27天)。而最后一个月(24月),如果是闰年就是28个火星日,平年则为27个火星日。 这样一来,平年长度为:20∗28+27∗4=668火星日,而闰年的长度为:21∗28+27∗3=669 火星日。
置闰规则
每十个火星年均由6个闰年及4个平年所组成没,还遵循以下原则:
能被1000整除的年份是闰年,669天。如星元1000,2000年。
所有为奇数年份是闰年,669天。如星元1,3,5,7,33,123年。
能被10整除的年份但不能被100整除的年份是闰年,669天。如星元10,20,90,110,1230年。
只能被100整除的年份,以及其他偶数年份均为平年,668天。如星元2,4,6,8,12,98,100,102,198,200年。
输入火星的日期,比如:星元 2021年10月27日,计算该日期是当年的第几天,以及距星元1年1月1日多少天(注:不算起点这天,也就是星元1年1月2日距星元1年1月1日为1天)。
输入格式:
在一行中输入火星日期,为三个整数,分别是:年、月、日
输出格式:
在第一行输出该日期是当年火星年的第几天;
在第二行输出距星元1年1月1日多少天。
大哥真强,上课直接现发啊
蹲答案
#include<iostream>
using namespace std;
int main()
{
int run_year = 0, ping_year = 0;
int year, month, day;
int put_out_1, put_out_2;
cin >> year >> month >> day;
for (int i = 1; i < year; i++)
{
if (i % 1000 == 0)
{
run_year++;
}
else if (i % 2 == 1)
{
run_year++;
}
else if (i % 10 == 0 && i % 100 != 0)
{
run_year++;
}
else
{
ping_year++;
}
}
int temp = month % 6;
int temp2 = month / 6;
month = month - 6 * temp2;
put_out_1= temp2 * 167 + 28 * (month - 1) + day-1;
put_out_2 = run_year * 669 + ping_year * 668 + temp2 * 167 + 28 * (month - 1) + day-1;
cout <<put_out_1<<endl<< put_out_2;
}
#include <stdio.h>
int main()
{
int Y,M,D;
int RY=669,PY=668,RM=28,PM=27;
int a,b,c=0;
scanf("%d%d%d",&Y,&M,&D);
if((M%6)==0)
{
if((M/6)==1)
a = 285+D;
else if((M/6)==2)
a = 2810+271+D;
else if((M/6)==3)
a = 2815+272+D;
else if((M/6)==4)
a = 2820+273+D;
}
else
b = (M%6)-1;
if(M/6==0)
a = 28b+D;
else if(M/6==1)
a = 28b+D+285+271;
else if(M/6==2)
a = 28b+D+2810+272;
else if(M/6==3)
a = 28b+D+2815+27*3;
a = a-1;
Y = Y-1;
for(;Y>0;Y--)
{
if((Y%1000==0)||(Y%2!=0)||((Y%10==0)&&(Y%100!=0)))
c = c+RY;
else c = c+PY;
}
c = c+a;
printf("%d\n%d",a,c);
return 0;
}