int main() { int num = 0; scanf("%d", &num); for (int i = 2; i <= num; ++i) { for (int j = i + 1; j <= num; ++j) { if (i * j == num) { for (int k = 2, z = 2;k<i, z < j; ++k, z++) { if(i%k==0||j%z==0){ printf("-1 -1"); break; } else{ printf("%d %d",i,j); break; } } } } } return 0; }
时间: 2024-01-12 07:04:44 浏览: 64
这段代码的功能是读入一个正整数num,然后在2到num之间枚举所有的数对(i,j),判断它们的乘积是否等于num,如果是,则再次对i和j进行遍历,判断它们是否为素数,如果都是素数,则输出它们,否则输出-1 -1。
但是这段代码存在几个问题:
1.在第三层循环中,变量k和变量z应该同时满足小于i和小于j才进行循环,而不是用逗号隔开。
2.如果i和j不是素数,则会输出-1 -1,但是并没有跳出循环,会继续判断后面的数对,应该加上一个break语句跳出内层循环。
3.在判断i和j是否为素数时,只需要判断2到sqrt(i)和2到sqrt(j)之间的数是否存在i和j的因数即可,不需要枚举到i和j本身。
所以可以改进代码如下:
```
#include <stdio.h>
#include <math.h>
int is_prime(int n) { // 判断n是否为素数
if (n < 2) {
return 0;
}
int sqrtn = sqrt(n);
for (int i = 2; i <= sqrtn; ++i) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
int main() {
int num = 0;
scanf("%d", &num);
for (int i = 2; i <= num; ++i) {
if (num % i == 0) { // 找到一个因子i
int j = num / i; // 另一个因子为num/i
if (is_prime(i) && is_prime(j)) { // 判断i和j是否为素数
printf("%d %d", i, j);
return 0;
} else { // 如果不是素数,则直接输出-1 -1
printf("-1 -1");
return 0;
}
}
}
return 0;
}
```
阅读全文