问题描述
int main ()
{
int num,i=num,isPrime;
printf("Enter an integer: ");
scanf("%d",&num);
while (i>=2)
{
if (num%i!=0)
i--;
if (num%i==0) //check if it is a factor
{
isPrime = 1;
for (int j=2; j<=i; j++)
{
if (i%j==0)
{
isPrime = 0;
break;
}
}
if (isPrime==1)
{
printf("%d ",i);
num = num/i;
}
}
}
return 0;
}
我可以知道为什么我的代码不起作用吗? 我试图编写一个 C 代码,它打印给定数字的所有质因数,从最大到最小,当我运行它时,在我输入一个数字后什么都不显示。
解决方法
-
缺少使用
-
scanf()
。
在将值读取到 -
i
分配给num
。这是将不确定的值分配给i
并使用该值调用未定义行为。 - 循环
j
直到它变成i
是错误的,因为除非i%i
为零,否则i
将始终为零。 - 当
i
和num%i==0
不是质数时,您也应该减少i
。否则,i
的更新将停在那里,循环可能会无限循环。 - 两个
if
语句if (num%i!=0)
和if (num%i==0)
可能会看到不同的i
值。这发生在迭代开始时的num%i!=0
时,因为i
在条件为真时更新。您应该使用else
而不是第二个if
语句。
#include
和 stdio.h
的必需标头 printf()
的 num
之前,将 固定代码:
#include <stdio.h>
int main (void)
{
int num,i,isPrime;
printf("Please enter an integer: ");
if (scanf("%d",&num) != 1)
{
fputs("read error\n",stderr);
return 1;
}
i=num;
while (i>=2)
{
if (num%i!=0) //check if it is a factor
{
i--;
}
else
{
isPrime = 1;
for (int j=2; j<i; j++)
{
if (i%j==0)
{
isPrime = 0;
break;
}
}
if (isPrime==1)
{
printf("%d ",i);
num = num/i;
}
else
{
i--;
}
}
}
return 0;
}
,
这里至少有一个错误:
int num,i=num,isPrime;
您似乎试图使 i
等于 num
。但是这里的 `num 甚至还没有被初始化。您必须在阅读用户输入后进行分配:
int num,isPrime;
printf("Please enter an integer: ");
scanf("%d",&num);
i=num;
素数的检查也是错误的:
for (int j=2; j<=i; j++)
{
if (i%j==0)
{
isPrime = 0;
break;
}
}
由于您使用 j<=i
,因此 j
最终将等于 i
并且 i%j==0
将为真,因此您找不到任何质数。试试j<i
。