质数分解,用sqrt缩小范围
题目:scanf一个整数,int32范围内,分解为质数序列输出
例如:
12分解为2 2 3
技巧就一个:用sqrt缩小范围
因为uint32(4,294,967,295)(接近43亿个数)范围内有2亿个左右质数,所以,一般不会用缓存去优化。
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>
bool is_prime_optimized(int n) {
if (n <= 1) {
return false;
}
int i2 = sqrt(n);
for (int i = 2; i <= i2; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int main() {
int a;
while (scanf("%d", &a) != EOF) {
int b = sqrt(a);
for (int i = 2; i <= b; i++) {
if (is_prime_optimized(i)) {
while (0 == a % i) {
printf("%d ", i);
a = a / i;
}
}
if (1 == a)break;
}
if (a > 1) {
printf("%d ", a);
}
}
return 0;
}