У меня проблемы с поиском подходящего решения этой проблемы. Мне нужно выяснить, какой день в календаре:
Проблема в том, что существует два типа года: обычный год и високосный год.
Например, если в одном году 365 днейи в одном месяце 50 дней, 365/50 = 7 месяцев в году, а остаток в 365% 50 = 15 дней в этом году, правило для подсчета високосного года - каждый остаток дня в году,мы должны добавить его к следующему году, поэтому високосный год произойдет, если число дней больше, чем число дней в месяце года, например, 15 + 15 + 15 + 15 = 60> = 50 (daysinmonth), поэтому високосный год произойдет вчетвертый год, что означает, что в четвертом году будет 8 месяцев, а остаток 60 дней - 50 дней = 10 дней, будет добавлен к пятому году для подсчета следующего високосного года, отсюда мы также знаем, что следующий скачокгод будет в 10 + 15 + 15 + 15> = 50, то есть через 3 года после четвертого года, поэтому следующий високосный год произойдет через седьмой год.
Моя задача - найти, какой день вдата 0001-01-01 (какой день первого дня первого месяца первого года).
Я не уверен, как подойти к этой проблеме, но решение, которое я могу придумать, хотя я не уверен, правильно илине означает ли сначала изменить дату на общее количество дней и вычесть ее по дням в году, а также определить високосный год, вычесть, пока общее число дней не станет меньше, чем число дней в году, и найти день, разделив его на общее количество дней в неделе? Есть ли лучшее решение?
input rule: daysinyear daysinmonth daysinweek date
1 <= daysinyear <= 2000
1 <= daysinmonth <= 200
1 <= daysinweek \<= 26
all month and days no more than 2 digit. so month or days that is 3 digit, is not applicable.
the days in calendar are A-Z , but will be reset according to how many days in week, if there is 5 days in a week, then A,B,C,D,E and the 6th day will be A again
input example :
daysinyear daysinmonth daysinweek date
100 10 10 0001-01-01
this means there is 100 days in 1 year, 10 days in 1 month, and 10 days in a week,
date format :YYYY-MM-DD
output: A
input : 100 10 10 0001-01-11
output: -1 (because 11 > 10)
input : 100 10 10 0001-01-10
output: J
Код на данный момент:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
using namespace std;
char arr[]={'A', 'B', 'C', 'D', 'E', 'F', 'G','H', 'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int main(int argc, char *argv[]) {
int daysinyear,daysinmonth,dayinweek;
cin>>daysinyear;
cin>>daysinmonth;
cin>>dayinweek;
cin>>str;
int flag=false;
vector<int>month;
std::replace(str.begin(),str.end(),'-',' ');
std::stringstream s(str);
int temp;
while(s>>temp)
month.push_back(temp); // to push year, month, date in month vector
int totalmonth=daysinyear/daysinmonth;
int rem=daysinyear%daysinmonth;
//from month vector, to get year,month,date
int year=month[0];
int mont=month[1];
int day=month[2];
if(daysinyear>2000 || daysinmonth>200||day > daysinmonth) //to make sure date is not wrong
{
flag=true;
cout<<-1;
return 0;
}
int yearcount=0;
int daysremainder=0;
int remaindertonextyear=0;
int totalday=((year-1)*daysinyear)+((mont-1)*daysinmonth)+day;
//count how many days in the given dte
while(totalday)
{
if(daysinmonth< (daysremainder*yearcount)+remaindertonextyear){ // for leap year
if(totalday-(totalmonth*daysinmonth)>0) //check to make sure totalday not negative
{
totalday-=(totalmonth+1)*daysinmonth; //substract with total days in a year
remaindertonextyear=(daysremainder*yearcount)-daysinmonth;
//find the remainder to sum for the next year
yearcount++;
yearcount=0; //reset year
}else{
int realday=((totalday-1)%daysinmonth)%dayinweek; //find what day from array,
cout<<arr[realday];
return 0;
}
}else{ //for not leap year
daysremainder=daysinyear%daysinmonth;
if(totalday-(totalmonth*daysinmonth)>0){
totalday-=(totalmonth*daysinmonth);
yearcount++;
}else{
int realday=((totalday-1)%daysinmonth)%dayinweek; //minus 1 because array 0-25
cout<<arr[realday];
return 0;
}
}
}
return 0;
}
Это единственное решение, о котором я могу думать, и в то же время я не знаю, правильно ли это илиневерно и для всех случаев.