#c_sharp #алгоритм
Есть код на C# разложения числа на множители. Понимаю весь код, кроме строчки: if (n / b * b - n == 0) Что проверяет данная строчка? Ведь пы просто получаем ноль, зачем тогда она нужна? using System; namespace ExpandNumberForum { class Program { public static void Main(string[] args) { string s = string.Empty; int b, c, n; Console.WriteLine("Input number: "); if (!int.TryParse(Console.ReadLine(), out n)) return; while ((n % 2) == 0) { n = n / 2; s += "2*"; } b = 3; c = (int)Math.Sqrt(n) + 1; while (b < c) { if ((n % b) == 0) { if (n / b * b - n == 0) { s += b.ToString() + "*"; n = n / b; c = (int)Math.Sqrt(n) + 1; } else b += 2; } else b += 2; } s += n.ToString(); Console.WriteLine(s); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } }
Ответы
Ответ 1
Эта строчка проверяет, что n нацело делится на b. То есть делает то же самое, что (n % b) == 0. if с проверкой n / b * b - n == 0 - лишний. function dividers(n) { var s = []; var b; var c; while ((n % 2) == 0) { n = n / 2; s.push(2); } b = 3; c = Math.floor(Math.sqrt(n)) + 1; while (b < c) { if ((n % b) == 0) { s.push(b); n = n / b; c = Math.floor(Math.sqrt(n)) + 1; } else b += 2; } s.push(n); return s; } console.log(JSON.stringify(dividers(621756)));Ответ 2
Оператор / выполняет целочисленное деление, т.е. деление с остатком, c округлением частного к нулю до целого. По этой причине в общем случае a / b * b не равно a. Равенство будет выполняться только в том случае, если a нацело делится на b. В "студенческом" коде часто встречается использование следующей техники вычисления остатка r от деления a на b r = a - a / b * b (до того, как студентам расскажут про существование оператора %, а также и после). Именно это вы и видите в данном коде. Проверка n / b * b - n == 0 - это проверка того, что остаток от деления n на b равен 0, т.е. того, что n нацело делится на b. Эквивалентно можно было написать n / b * b == n, но лучше, конечно, воспользоваться оператором % и просто проверить n % b == 0. Как правильно заметил @Igor в своем ответе, проверять n / b * b - n == 0 после уже выполненной эквивалентной проверки n % b == 0 - совершенно бессмысленный шаг.
Комментариев нет:
Отправить комментарий