题解 | #质数因子#
质数因子
https://www.nowcoder.com/practice/196534628ca6490ebce2e336b47b3607
#include <stdio.h>
int main() {
//原理:
//①质数(Prime Number):一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫作质数
//②任何大于1的正整数都可以被拆分成多个质数相乘。
//③一个数字n可以拆分成a*b,那么 a 或 b 至少有一个小于 根号n
//1 1*1 1是没有质数因子的,题目有问题
//2 1*2 2的质数因子是2
//3 1*3
//4 2*2
//5 1*5
//6 2*3
//15 3*5
//180 2*2*3*3*5
//...
unsigned int num = 0;
scanf("%u", &num);
//以下方发超时
// unsigned int i =0;
// for (i = 2; i <= num; i++) {
// if (num%i == 0) { //能被i取余,说明能够被i整除
// while(num%i == 0) {
// //把所有 i的因子的数字都取出,
// //例如:i=2; 要把是2的因子都去掉;这样i=4是,num就整除不了了
// printf("%u ", i);
// num /= i;
// }
// }
// }
unsigned int i = 0;
for (i = 2; i*i <= num; i++) {//一个数字n可以拆分成a*b,那么 a 或 b 至少有一个小于 根号n
if (num % i == 0) { //能被i取余,说明能够被i整除
while (num % i == 0) {
//把所有 i的因子的数字都取出,
//例如:i=2; 要把是2的因子都去掉;这样i=4是,num就整除不了了
printf("%u ", i);
num /= i;
}
}
}
if (num !=1) { //num != 1说明没被除尽,还有一个大于 根号n 的因子,即是num
printf("%u", num);
}
return 0;
}
收获点:
做不出来的原因是数学知数不过关,原理:
①质数(Prime Number):一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫作质数
②任何大于1的正整数都可以被拆分成多个质数相乘。
③一个数字n可以拆分成a*b,那么 a 或 b 至少有一个小于 根号n

