C/C++

Задача на языке С

Земной год продолжается 365 1211/5000 суток. Из этого
следует, что точной была бы такая календарная система,
при которой среди 5000 следующих друг за другом годов
имеется 1211 високосных и соответственно 3789 невисокосных. Эта система, основанная на 5000 летних циклах,
была бы неудобной в практических отношениях. Задача
построения более удобных календарных систем решается
с помощью подходящих дробей (см. задачу 575). Найти,
используя вычислительную машину, все подходящие дроби
числа 1211/5000. Какая именно из этих дробей определяет
закон чередования невисокосных и високосных годов в современном календаре (четырехлетние циклы)? Указать также
подходящую дробь, определяющую закон чередования
в календаре Омара Хайяма, в котором рассматривались не
четырех летние, а тридцатилетние циклы.
Эталонный цикл 5000 лет:
1211 / 5000 = 0,2422 високосных дня на 1 год цикла.

Современный Григорианский календарь имеет 400 летний цикл с 97 високосными годами: 97 / 400 = 0,2425 високосных для на 1 год цикла, погрешность:
(0,2425 - 0,2422) / 0,2422 * 100 = 0,124%

Выкинутый на свалку истории всеми, кроме православной церкви, Юлианский календарь имел 4 летний цикл с 1 високосным годом: 1 / 4 = 0,25 високосных дня на 1 год цикла, погрешность:
(0,25 - 0,2422) / 0,2422 * 100 = 3,22%

В иранском календаре цикл составляет 33 года с 8 високосными годами: 8 / 33 = 0,(24) високосных дня на год цикла, погрешность:
(0,(24) - 0,2422) / 0,2422 * 100 = 0,0926%
 #include 
#include

using namespace std;

int main() {
int start, finish;
cout start;
cout finish;

int a = 2, b = 1;
for (int n = start; n
АД
Андрей Долгобородов
99 708
Лучший ответ
Oleksandr Ozernyak Нужен код, а не исторические данные
Как я понимаю вопрос не столь исторический сколь математический.

Как подобрать такое целое количество дней и период их повторения чтобы наилучшим образом приблизиться к значению некоей дроби, в нашем случае дроби 1211/5000 максимально сократив знаменатель. Т.е. найти такие m и n натуральные что: соотношение (5000*n - 1211*m)/(m*n) было минимально по модулю.

алгоритм можеть быть простой посчитать все 6 млн вариантов (1..1211) / (1 .. 5000) и найти тот который по модулю будет дешевле всего.

Или восользоваться алгоритмом Евклида (реализация ниже) и найти следующие " Подходящие " дроби.


Как нетрудно заметить этим и пользовались ученые древности выбирая календари.
И как мне кажется 128 лет для накопления ошибки в один день вполне достаточная точность для любого человека, и дальнейшая оптимизация не дает существенных преимуществ по сравнению с тем чтобы сделать корректировку раз в 100 лет.
 #include  
#include
#include
#include

std::vector euclide(int i, int j){
std::vector ret;
int tmp;
while(i*j){
ret.push_back(i/j);
tmp = i;
i = j;
j = tmp%j;
}
return ret;
}

std::pair make_approx(const std::vector& euc, unsigned sz){
std::pair ret {1,0};
int tmp;
if(!euc.size())
return {};
if(sz>euc.size()-1)
sz = euc.size()-1;
auto it = euc.cbegin()+sz;
++sz;
while(sz--){
tmp = ret.first;
ret.first = ret.first* (*(it--)) + ret.second;
ret.second = tmp;
}
return ret;
}

int main(){
auto a = euclide(5000,1211);
for(int i=0;i