Чуть более точный алгоритм