Ну, во-первых, я бы переместил особый случай 2 из цикла, нет смысла проверять это во всем цикле, когда он может быть обработан один раз. Если возможно, используйте тип данных int
вместо uint
, так как обычно он быстрее:
if (largest_pFact % 2 == 0) {
largest_pFact /= 2;
}
int i = 3;
while (i < Math.Sqrt((double) largest_pFact)) {
if (i % 2 != 0) {
if (largest_pFact % i == 0) {
largest_pFact /= i;
}
}
i++;
}
Расчет квадратного корня является относительно дорогим, поэтому его также следует сделать заранее:
if (largest_pFact % 2 == 0) {
largest_pFact /= 2;
}
int i = 3;
int sq = Math.Sqrt((double) largest_pFact);
while (i < sq) {
if (i % 2 != 0) {
if (largest_pFact % i == 0) {
largest_pFact /= i;
}
}
i++;
}
Тогда я бы увеличил i
с шагом в два, чтобы уменьшить одну проверку по модулю:
if (largest_pFact % 2 == 0) {
largest_pFact /= 2;
}
int i = 3;
int sq = Math.Sqrt((double) largest_pFact);
while (i < sq) {
if (largest_pFact % i == 0) {
largest_pFact /= i;
}
i += 2;
}
Для работы, я считаю, что вам нужно while
вместо if
внутри цикла, в противном случае будут пропущены повторяющиеся факторы:
if (largest_pFact % 2 == 0) {
largest_pFact /= 2;
}
int i = 3;
int sq = Math.Sqrt((double) largest_pFact);
while (i < sq) {
while (largest_pFact % i == 0) {
largest_pFact /= i;
}
i += 2;
}