我正在完成家庭作业,以计算用户选择的第n个素数。我有这个工作得很好,并且相当快,但我决定添加一个错误消息,如果用户输入任何大于50000.由于某种原因,这决定不工作,所以我把它拿出来。之后,一旦用户输入他们想要的素数,我的程序就会冻结。
#include <stdio.h>
int main(void)
{
long int pFactor,test,nthCount,target,result,notPrime;
test=2;
nthCount=0;
printf("Which prime number do you want to know?");
scanf("%li",&target);
while (nthCount<target)
{
for(pFactor=test/2;pFactor>1;pFactor--)
{
notPrime=0;
result=(test%pFactor);
if(result==0)
{
notPrime=1;
break;
}
if(notPrime!=1)
{
nthCount++;
notPrime=0;
test++;
}
}
}
test--;
printf("The %li prime number is %li.\n",target,test);
return 0;
}
我认为这与scanf相关,就像我试图打印之后的任何内容都没有出来。
答案 0 :(得分:6)
for(pFactor=test/2;pFactor>1;pFactor--) // where test = 2
推断, pFactor&gt; 1 总是 false(1&gt; 1)
因此,流程永远不会进入for
循环,因此nthCount
始终保持0
。
while (nthCount<target) // becomes an infinite loop
答案 1 :(得分:0)
你的程序陷入无限循环。对于所有情况,for循环的主体都是无法访问的,并导致while循环运行无限时间。修改你的程序并在下次自己调试你的程序。
答案 2 :(得分:0)
在这种情况下(程序冻结),您通常可以通过进行一些观察来快速找到问题的根源。
首先,找出它是否是无限循环或阻止程序流的某些功能。 100%CPU使用率是失控循环的良好指标,0%CPU使用率是指示程序阻塞的良好指标,即等待某些事件发生。在你的情况下,你可能已经注意到它是第一个:无限循环。
然后试着找出发生这种情况的原因和原因。例如,您可以在可疑循环中的战略位置添加调试输出。你可以调整你的循环体:
while (nthCount<target)
{
/* added debug output: */
printf("%ld, %ld, %ld\n", target, nthCount, pFactor);
for(pFactor=test/2;pFactor>1;pFactor--)
{
/* omitted for the sake of brevity */
}
}
运行它,你会看到类似这样的东西:
$ gcc test.cc && echo 1 | ./a.out | head
Which prime number do you want to know?1
1, 0, 0
1, 0, 1
1, 0, 1
1, 0, 1
1, 0, 1
1, 0, 1
1, 0, 1
1, 0, 1
1, 0, 1
在这里你可以看到外部循环无限旋转,因为内部循环从不执行(最后一个数字总是小于或等于1),因此外部循环的循环条件永远不会改变(因此永远不会错误) 。这是你可以开始修复它的地方。