Написать программу в паскале вводим число, проверить извлекается из него корень?

0 голосов
70 просмотров

Написать программу в паскале вводим число, проверить извлекается из него корень?


Информатика (25 баллов) | 70 просмотров
Дано ответов: 2
0 голосов
Правильный ответ

Из математики известно, что квадрат любого числа n можно представить в виде суммы арифметической прогрессии вида 1+3+5+...+2n-1
Следовательно, достаточно последовательно вычислять сумму членов этой прогрессии до тех пор, пока либо не получим значение заданного числа (и тогда это количество и есть точное значение корня), либо квадрат количества членов накопленной суммы не превысит исходного числа (и тогда корень в целых числах не извлекается).

Программа на языке Паскаль (Free Pascal/Lazarus, Borland Delphi, PascalABC.Net, Pascal ABC).

!!! Гарантируется правильная работа программы при вводе натуральных чисел, не превышающих 9 223 372 030 926 249 001

var
  i,n,m:int64;
begin
  Write('Вводите: ');
  Read(m);
  n:=0;
  for i:=1 to m div 2 do
    begin
      n:=n+2*i-1;
      if (n>=m) then break
    end;
  if n=m then Writeln('Кв.корень(',m,')=',i)
  else Writeln('Кв.корень(',m,') не является целочисленным')
end.

Примеры работы программы

Вводите: 255240500157504
Кв.корень(255240500157504)=15976248

Вводите: 225
Кв.корень(225)=15

Вводите: 56846356333463
Кв.корень(56846356333463) не является целочисленным

Вводите: 9223372030926249001
Кв.корень(9223372030926249001)=3037000499

(150k баллов)
0 голосов

Var a,b:integer;
begin
write('a = ');
readln(a);
b:=round(sqrt(a));
if b*b=a
 then writeln('Yes, ',b,' * ',b,' = ',a)
 else writeln('No');
end.

Пример 1:
a = 289
Yes, 17 * 17 = 289

Пример 2:
a = 250
No

(194k баллов)
0

Нелишне будет заметить, что максимально допустимым для ввода числом является 2147483647

0

Замена описания на var a,b:int64; полностью проблему не решает; например, для допустимого в такой арифметике значения 9223372030926249001 должно возвращаться точное значение корня 3037000499, а возникает арифметическое переполнение.

0

Так, при работе в Windows .Net, последнее допустимое число для ввода, при котором работа не нарушается, будет 4 611 686 016 279 903 999. Далее следует ошибка в вызове Convert.ToInt32(Math.Round(x)).

0

Это еще раз показывает, что при смешении разных типов переменных промежуточные результаты могут давать ошибки, даже если переменные находятся в допустимом для них диапазоне.