输入:一个正整数
输出:对其进行质因式分解。例如,输入90,打印出90=2*3*3*5
。
实现
需要注意的是,给出的示例中有*3*3
,同一个因子可能多次使用,因此要使用while来除
void primeFactorization(int n) {
for(int i=2;i<=n;i++){
while(n!=i){
if(n%i==0){
printf("%d*", i);
n=n/i;
}else{
break;
}
}
}
printf("%d\n", n);
}
int main() {
int n;
scanf("%d", &n);
printf("%d=", n);
primeFactorization(n);
return 0;
}
测试
优化
上面的代码虽然能正确分解,但当n已经是质数时,无法停止循环,存在冗余遍历,效率低下。
例如:输入n=7(质数)时:
i从2递增到7,每次while(n != i)条件不成立。
循环结束后打印n=7,输出7=7(虽然结果正确,但是冗余遍历了2-7的过程)。
当i > sqrt(n)时,剩余n必为质数,可直接终止循环。
void primeFactorization2(int n) {
if (n == 1) {
printf("1\n");
return ;
}
int isFirst = 1; // 标记是不是首个因数
for (int i=2; i*i <= n;i++) { // 减少循环次数
while (n%i == 0) {
if (isFirst) {
printf("%d", i);
isFirst = 0;
} else {
printf("*%d", i);
}
n /= i;
}
}
// 处理剩余的大于1的质因数
if (n>1) {
if (isFirst) {
printf("%d", n); // n本身是质数
} else {
printf("*%d", n);
}
}
printf("\n");
}
运行
与上面一样,不多余贴图了