Я играю в Codingame с c ++. У меня только средний уровень в c ++.
проблема, с которой я столкнулся, заключалась в том, что мне нужно дважды вызвать функцию, чтобы получить от нее правильное значение:
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
long double dist(long double phi1,long double lam1,long double phi2,long double lam2){
phi1 *= M_PI/180;
phi2 *= M_PI/180;
lam1 *= M_PI/180;
lam2 *= M_PI/180;
long double R{(pow( (phi1-phi2)*cos(lam1 + (lam2-lam1)/2) ,2) + pow(lam1 - lam2 , 2))} ;
return R;
}
long double formatting(string n){ //the values contain a ',' instead of '.'
long double M{0};
int comma{0};
for(char num: n){
if (num ==','){
comma += 1;
} else{
if (comma){
M += atoi(&num)/(pow(10,comma));
comma += 1;
}else{
M *= 10;
M += atoi(&num);
}
}
}
return M;
}
int main(){
long double min_distance{9999999999999};
string min_name{"None"};
string LON;
cin >> LON; cin.ignore();
string LAT;
cin >> LAT; cin.ignore();
int N;
cin >> N; cin.ignore();
for (int i = 0; i < N; i++) {
string id{};
string name{};
string add{};
string tel{};
string phi{};
string lam{};
getline(cin, id,';');
getline(cin, name,';');
getline(cin, add,';');
getline(cin, tel,';');
getline(cin, phi,';');
getline(cin, lam);
if (min_distance >= dist(formatting(LON),formatting(LAT) ,formatting(phi),formatting(lam)) ){
// min_distance = dist(formatting(LON),formatting(LAT) ,formatting(phi),formatting(lam));
// dist(formatting(LON),formatting(LAT) ,formatting(phi),formatting(lam));
min_distance = dist(formatting(LON),formatting(LAT) ,formatting(phi),formatting(lam));
min_name = name;
}
}
cout << min_name << endl;
cerr <<"The min distance: "<<min_distance<<endl;
}
если я раскомментируйте одну из строк:
// min_distance = dist(formatting(LON),formatting(LAT) ,formatting(phi),formatting(lam));
// dist(formatting(LON),formatting(LAT) ,formatting(phi),formatting(lam));
Я получаю именно то значение, которое хочу (у меня в основном проблемы со значением 0)
неправильный вывод:
cerr : The min distance: 1.25967e-07
cout : Maison de la Prevention Sante
правильный вывод:
cerr : The min distance: 0
cout : Cimetiere Saint-Etienne
Вместо того, чтобы давать вам какой-либо другой вывод, вы можете напрямую go и попробовать его на веб-сайте: https://www.codingame.com/ide/puzzle/defibrillators
Спасибо