只有下面的函数
素因子的作用
void prime(int x) {
int i, j;
写这个是因为它想获取信息但没有任何
for (i = 2; i <= x; i++) {
if (x % i == 0) {
for (j = 2; j <= i; j++) {
if (i == j) {
printf("%d", i);
} else
if ((i % j) != 0) {
printf("%d\n", i);
输出应该是数字的素数,并且应该看到重复的素数no.s,因此通过多重化我们得到原始数字
goto l;
此处goto
语句取消if
循环
} else {
break;
}
}
l:
x = x / i;
}
}
}
代码似乎是正确的,并且也给出了素数,但是因素并没有重复。
例如:24
输出应为2,2,3
,但输出为2,3
答案 0 :(得分:1)
goto
语句没用,它完全等同于你的break
语句。它没有突破if
循环,它突然出现for
循环,这正是break
所做的。
此外,内部循环是无用的:如果将x
除以i
,则可以有效地从x
中移除较小的素数,而x % i == 0
仅适用于素数值i
。
输出中的问题来自于即使i
是x
的倍数,您也会增加i
。因此,您只打印一次素数因子,而不是从x
完全删除它。
因此可以将该功能简化为:
void primefactors(int x) {
int i;
for (i = 2; i <= x;) {
if (x % i == 0) {
printf(" %d", i);
x = x / i;
} else {
i++;
}
}
printf("\n");
}
可以更快地完成此功能:当i
大于x
的平方根时,您可以停止扫描:
void primefactors(int x) {
int i;
for (i = 2; i * i <= x;) {
if (x % i == 0) {
printf(" %d", i);
x = x / i;
} else {
i += 1 + (i & 1); // skip even numbers
}
}
printf("%d\n", x);
}
答案 1 :(得分:0)
我的解决方案。如果需要,我可以添加评论。
#include <stdio.h>
void prime_factors(int num) {
int i = 2;
while(num > 1) {
while(num % i == 0) {
num /= i;
printf("%d ", i);
}
i++;
}
}
int main() {
int num;
while(1) {
printf("%s", "Enter the number: ");
if(scanf("%d", &num) != 1)
break;
// \033[1;31m - changes text color to red
// \033[0;0m - resets color back to default
// It works on Linux, I don't know about Windows.
if(num <= 1) {
puts("\033[1;31mThe number must be greater than 1.\033[0;0m");
continue;
}
puts("Prime factors are:");
prime_factors(num);
puts("\n");
}
return 0;
}
<强>测试强>
Enter the number: 24
Prime factors are:
2 2 2 3
Enter the number: 12
Prime factors are:
2 2 3
Enter the number: 1000
Prime factors are:
2 2 2 5 5 5