#include <stdio.h>
#include <math.h>
int main()
{
int n;
system("chcp 1251");
printf("Введите целое число\t");
scanf_s("%d", &n);
for (int i = 2; i < sqrt(n) + 0.00001; ) {
if (n % i == 0) {
printf("%d ", i);
n /= i;
}
else {
++i;
}
}
if (n > 1)
printf("%d", n);
getchar(); getchar();
return 0;
}
Вот простой код на С, который выводит простые делители числа.
Пример: 2600 = 2*2*2*5*5*13. Так вот, почему в for'е написано именно sqrt(n) + 0.00001?
intи IEEE754double) этот пример будет работать корректно даже при сравнении с<=т.к. целые типы представляются без погрешности... само собой, я не рекомендую и не оправдываю использование таких тонких и зыбких механик где-либо... – Fat-Zer Mar 29 '19 at 02:15i*i <= n. – Fat-Zer Mar 29 '19 at 02:17i <= nне учтёт второй случай, из-за чего, к примеру, значение4.0000015268будет ошибочно пропущено приn = 16. – Arhadthedev Mar 29 '19 at 02:17iопять же будет пропущено. Это целочисленная арифметика гарантирует неявное округление после каждой операции, которое сбрасывает неточности. Приdoubleже иfloatнам приходится самим учитывать наличие погрешности и её рост. – Arhadthedev Mar 29 '19 at 02:25