Две окружности
Ссылка на засчитанное решение.
Определить количество точек пересечения двух окружностей.
Входные данные
6 чисел x1, y1, r1, x2, y2, r2, где x1, y1, x2, y2 — координаты центров окружностей, а r1, r2 – их радиусы. Все числа — действительные, не превышают по модулю 1000000000, заданы не более чем с 3-мя знаками после запятой.
Выходные данные
Количество точек пересечения. Если точек пересечения бесконечно много, то вывести -1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <cstdlib> #include <iostream> #include <cmath> using namespace std; int main() { double x1, y1, r1; double x2, y2, r2; cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2; if( x1 == x2 && y1 == y2 && r1 == r2 ) { cout << -1 << endl; } else if( sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) == r1+r2 || sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) + r2 == r1 || sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) + r1 == r2 ) { cout << 1 << endl; } else if( sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) > r1+r2 ) { cout << 0 << endl; } else if( sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) + r2 < r1 || sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) + r1 < r2 ) { cout << 0 << endl; } else { cout << 2 << endl; } } |
Считываем данные, далее если координаты центров и длины радиусов совпадают печатаем: «-1». Затем рассматриваем варианты, когда окружности имеют одну, две общих точки либо не имеют ни одной.
Код на Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import java.util.*; import java.lang.*; import java.io.*; class Main { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); double x1, y1, r1; double x2, y2, r2; x1 = in.nextDouble(); y1 = in.nextDouble(); r1 = in.nextDouble(); x2 = in.nextDouble(); y2 = in.nextDouble(); r2 = in.nextDouble(); if( x1 == x2 && y1 == y2 && r1 == r2 ) { System.out.println(-1); } else if( Math.sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) == r1+r2 || Math.sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) + r2 == r1 || Math.sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) + r1 == r2 ) { System.out.println(1); } else if( Math.sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) > r1+r2 ) { System.out.println(0); } else if( Math.sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) + r2 < r1 || Math.sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) + r1 < r2 ) { System.out.println(0); } else { System.out.println(2); } } } |
Код Ideone
Засчитанное решение на e-olimp
Слава! Мы уже это несколько раз это обсуждали. Нельзя просто брать на сайте e-olymp.com задачи и ожидать, что я зачту их вместо тех, которые входят в нашу обязательную программу.
Как только вы решите все выданные Вам задачи, я стану учитывать задачи Вашего самостоятельного выбора.
задача 4050 забавная игра обязательна
Добавьте ссылку на засчитанное решение на Java (и заодно можно ссылку на ideone). А то я удивляюсь, как вообще такое решение скомпилируется с sqrt, а не Math.sqrt.
Добавил ссылки.
Засчитано, 7 баллов.