BASI C: Понимание моего собственного кода Ada. Нахождение чисел, которые делят целое число без дробей - PullRequest
2 голосов
/ 21 февраля 2020

Я должен кодировать процедуру, которая находит все целые числа, которые равномерно делят число, и я нашел решение, которое работает; к сожалению, с моим несуществующим знанием кодирования, я не знаю , почему это работает.

Вот базовый c код:

Get(Number)
A:=1
for X in 1..Number-1 loop
   A:=A+1;
   C:=Number/A;
   if C*A = Number then
      Put(A)
   end if;
end loop;

Я имею Отредактировав некоторые чистые путы для читабельности, я понимаю, что A увеличивается с 1 каждым шагом l oop, но я не совсем понимаю, какое число C сохраняет каждый l oop. Я попытался вернуться, напечатав его, и он переходит между значениями 2 и 1 для значения 10 на «число». Вместо того, чтобы быть 1 или 2, я хотел бы видеть это как 10/1, 10/2, 10/3, 10/4, 10/5, 10/6 и т. Д. c, то есть, как только мы достигнем утверждения if, мы у нас будет, скажем, 10/4 * A, где A равно 4, а альт - 10, хотя 10 не делится на 4.

Как обновляется C, может кто-нибудь объяснить простым сроки?

1 Ответ

0 голосов
/ 28 февраля 2020

Я предполагаю, что целые числа для поиска должны быть положительными. В этом случае тип Number, A, C и X вместо этого может быть Positive. Если ввод не является положительным числом, то будет сгенерировано исключение CONSTRAINT_ERROR. Это безопаснее: исключение ясно указывает, что что-то пошло не так, и это лучше, чем возвращать неверный результат.

Обратите внимание, что программа никогда не проверяет, является ли 1 действительным делителем, даже если это так. Это потому, что A увеличивается в начале цикла; поскольку его начальное значение равно 1, первое проверенное значение равно 2. В любом случае, лучше использовать X, переменную l oop. В вашей программе он принимает значения в диапазоне от 1 до Number - 1, включая оба конца. Кроме того, X будет вести себя как константа внутри тела l oop, что исключает риск случайного перезаписи его значения.

Значение, присвоенное C, является результатом деления Number свыше A Учитывая, что эти переменные являются целыми числами, результат деления будет усечен. Для положительных чисел это эквивалентно «округлению» результата. Если Number равномерно делится на A, то остаток будет равен нулю, поэтому умножение приведет к исходному значению. В противном случае остаток будет потерян, поэтому значение C * A будет меньше значения A.

Более простой подход состоит в том, чтобы непосредственно вычислить остаток от обоих чисел, а затем проверить, является ли оно это ноль. Вот такой код:

procedure Main is
   Number : Positive;
begin
   Get (Number);
   for A in 1 .. Number loop
      if Number rem A = 0 then
         Put (A);
      end if;
   end loop;
end Main;
...