#include #include #define eps 1e-9 #define PI 3.1415926535897932384626433832795 int in(void) //Функция для считывания координат { int d, m, s; //Градусы, минуты и секунды char c='S'; //Полушарие int res; //Координата точки в секундах scanf("%d %d %d %c", &d, &m, &s, &c); //Считываем координаты и полушарие res=d*60*60+m*60+s; //Переводим координаты в секунды, if (c=='S' || c=='W') res=-res; //учитывая в каком полушарии находится точка return res; //и возвращаем получившийся результат } void out1(int sek) //Функция для вывода широты точки по её выражению в секундах { int d, m, s; //Градусы, минуты и секунды char c='N'; //Полушарие if (sek<0) //Если секунды отрицательны, то { c='S'; //изменяем полушарие на южное sek=-sek; //и берём секунды по модулю } //По величине угла в секундах находим его выражение s=sek%60; //в секундах, m=(sek/60)%60; //минутах и d=sek/3600; //градусах printf("%d %d %d %c ", d, m, s, c); //Выводим получившиеся координаты } void out2(int sek) //Функция для вывода долготы точки по её выражению в секундах { int d, m, s; //Градусы, минуты и секунды char c='E'; //Полушарие if (sek<0) //Если секунды отрицательны, то { c='W'; //изменяем полушарие на южное sek=-sek; //и берём секунды по модулю } //По величине угла в секундах находим его выражение s=sek%60; //в секундах, m=(sek/60)%60; //минутах и d=sek/3600; //градусах printf("%d %d %d %c", d, m, s, c); //Выводим получившиеся координаты } double angle(double x1, double y1, double z1, double x2, double y2, double z2) //Функция для вычисления угла между двумя радиус-векторами { return acos(x1*x2+y1*y2+z1*z2); } void toCartesian(int phi, int theta, double *x, double *y, double *z) //Функция для перевода координат точки из сферических в полярные { *x=cos(phi*PI/(180*3600))*cos(theta*PI/(180*3600)); *y=sin(phi*PI/(180*3600))*cos(theta*PI/(180*3600)); *z=sin(theta*PI/(180*3600)); } int main(void) { int phi1, theta1; //Сферические координаты столицы int phi2, theta2; //Сферические координаты резиденции int phi, theta; //Сферические координаты искомой точки double x1, y1, z1; //Декартовы координаты столицы double x2, y2, z2; //Декартовы координаты резиденции double a, b, c; //Коэффициенты плоскости, в которой лежит кратчайший путь double x, y, z; //Декартовы координаты ближайшей к северному полюсу точки, //лежащей в той же плоскости, что и кратчайший путь double lambda, mu; freopen("plane.in", "r", stdin); //Открываем входной файл freopen("plane.out", "w", stdout); //Открываем выходной файл toCartesian(phi1=in(), theta1=in(), &x1, &y1, &z1); //Считываем координаты столицы и переводим их в декартовы toCartesian(phi2=in(), theta2=in(), &x2, &y2, &z2); //Считываем координаты резиденции и переводим их в декартовы if (fabs(x1+x2)z2) //Если у столицы координата по оси Oz больше, { theta=theta1; //то записываем в ответ phi=phi1; //сферические координаты столицы } else //Иначе { theta=theta2; //записываем в ответ phi=phi2; //сферические координаты резиденции } } out1(theta), out2(phi); //Выводим ответ } } return 0; }