Возврат массива из метода, как работает цикл for?
Есть цикл for в методе FindFactors, который ищет множитель числа, в условии сказано: пока i < num/2 + 1, я понимаю, что /2 + 1 нужно чтобы цикл не сохранил само число, но если это убрать, то все останется таким же, если сделать запись num + 1, то тогда уже цикл сохранит само число. Дак в каких случаях будет нужна запись num/2 + 1? Вот код:
class Factor
{
public int[] FindFactors(int num, out int numfactors)
{
int[] facts = new int[80];
int i, j;
for (i = 2, j = 0; i < num/2 + 1; i++)
{
if ((num % i) == 0)
{
facts[j] = i;
j++;
}
}
numfactors = j;
return facts;
}
}
class FindFactors
{
static void Main()
{
Factor f = new Factor();
int numfactors;
int[] factors;
factors = f.FindFactors(1000, out numfactors);
Console.WriteLine("Множители числа 1000: ");
for (int i = 0; i < numfactors; i++)
{
Console.WriteLine($"{factors[i]}");
}
Console.WriteLine();
}
}
Ответы (2 шт):
num/2 используется, чтобы сократить количество итераций - ведь между этим значением и num точно нет делителей. Если само num нужно, просто отдельно его запишите.
Ещё разумнее было бы сделать цикл до корня из числа, сведя количество операций к sqrt(num), записывая сразу пару делителей
while (i*i < num) {
if ((num % i) == 0)
{
facts[j] = i;
j++;
facts[j] = num / i;
j++;
}
i++;
}
if (i*i == num) {
facts[j] = i;
j++;
}
я понимаю, что /2 + 1 нужно чтобы цикл не сохранил само число
Нет, деление на 2 нужно для того, чтобы сократить количество итераций при поиске делителей.
Однако, сократить количество итераций можно еще больше, если идти в цикле до квадратного корня из числа.