Поля
(Время: 1 сек. Память: 16 Мб Сложность: 16%)
Построение требуемого квадратного поля с целой стороной x возможно при условии выполнения равенства x*x=a*b для некоторого целого x. Это возможно при условии, что x = sqrt(a*b) – целое число. Тогда алгоритм решения задачи может выглядеть просто:
read(a,b)
x = int(sqrt(a*b))
if(x*x = a*b) write(x) else write(0)
Однако, на практике могут возникать проблемы с технической реализацией данного фрагмента. Заметим, что 4-байтового типа недостаточно для решения задачи, поэтому следует использовать типы, позволяющие хранить большие значения. Компиляторы Delphi и Visual C чувствительны к типу аргумента и могут вызывать ошибку компиляции или ошибку времени выполнения, если для переменных a и b выбран 8-байтовый целый тип. Здесь лучше использовать вещественное значение или явное преобразование целого в вещественное.
Другой подход к решению данной задачи может быть основан на полном переборе возможных значений x, которые могут лежать в диапазоне от 1 до 107. Это избавит от операции извлечения квадратного корня, но увеличит время выполнения программы:
x=0
while(x*x < a*b) x++;
if(x*x = a*b) write(x) else write(0)
|