Найти день заданной даты в произвольной программе календаря - PullRequest
0 голосов
/ 23 октября 2019

У меня проблемы с поиском подходящего решения этой проблемы. Мне нужно выяснить, какой день в календаре:

Проблема в том, что существует два типа года: обычный год и високосный год.

Например, если в одном году 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;
}

Это единственное решение, о котором я могу думать, и в то же время я не знаю, правильно ли это илиневерно и для всех случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...