// 10001st prime
* By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13,
* we can see that the 6th prime is 13.
* What is the 10001st prime number?
#include<stdio.h>
#include<math.h>
#define FIRST_NUM 2
#define START_COUNT 0
void prime(int num, int count)
int i, flag=1;
for(i=2; i<=sqrt(num); i++)
if(num%i==0)
flag=0;
break;
flag=1;
if(flag)
count++;
if(count==10001)
printf("The 10001st prime number is %d\n", num);
if(count!=10001)
prime(num+1, count);
int main(void)
prime(FIRST_NUM, START_COUNT);
return 0;
// Answer: 104743
I used both CodeBlocks和Eclipse在这两个平台上。
It is running fine in Linux, in CodeBlocks, with:
The 10001st prime number is 104743
Process returned 35 (0x23) execution time : 0.0109 s
But not in Windows.
However, when I tried to debug it in CodeBlocks(在Windows中)它给了我这个error:
Program received signal SIGSEGV, Segmentation fault
and call stack as:
Nr= #0 | Address= 77101566 | Function= msvcrt!modf() | File= (C:\WINDOWS\SysWOW64\msvcrt.dll:??)
Nr= #1 | Address= ?? | Function= ?? () | File= (??:??) //I don't think this one is important :)
我试图在互联网上搜索有关SIGSEGV错误的信息,但无法得到满足。
请尽可能多地解释。
我将非常感激。)
SIGSEGV,虽然在Linux中运行正常,但在Windows中出现分段故障
1
人不认可
5
个评论
分段故障很可能指向未定义的行为,这也会导致预期的行为。因此,如果它在一个操作系统下可以工作,但在另一个操作系统上不能工作,你不能断定代码的正确性是取决于操作系统的。
Marc B
:
你没有返回任何值,你没有改变任何东西,你只是向下潜入10000次左右,然后退出,所以递归本质上是无用的。
Sachin
:
@cad 好吧,请告诉我这里有什么问题,真的?我想这是一个非常基本的代码,没有涉及到重的东西。
堆栈溢出,我敢肯定。递归在Windows上炸毁了你的堆栈。显然,你的Linux版本有更多的堆栈空间。
lurker
:
我对你的程序做了一个快速修改,以确定递归的深度。它递归了104741个调用的深度。这是个很大的问题。这可能是一个堆栈空间问题,至少在Windows上是这样。在Linux上,它可能是一个问题,但可能没有表现为分段故障。补充一下@MarcB的观点,使用递归不仅仅是一个品味问题。它是实现这种算法的一种糟糕的方式,很可能导致你的问题。
Sachin
发布于
2016-01-30
1
个回答
user3629249
发布于
2016-01-30
已采纳
0
人赞同
下面的代码编译干净,产生了预期的输出,不使用递归,大大减少了
flag
值的抖动量,将计算算法与结果显示分开,在linux 14.04上进行了测试。
// 10001st prime
* By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13,
* we can see that the 6th prime is 13.
* What is the 10001st prime number?
#include <stdio.h>
#include <math.h>
#define FIRST_NUM (2)
#define START_COUNT (0)
#define WHICH_PRIME (10001)
int prime( void )
int i;
int num = FIRST_NUM;
for( int count = 0; count < WHICH_PRIME; )
int flag=1;
int j = (int)sqrt((double)(num));
for(i=2; i<=j; i++)
if( !(num%i) )
flag=0;
break;
if(flag)
count++;
if(count==10001)
break;
num++;
return num;
int main(void)
int result = prime();
printf("The 10001st prime number is %d\n", result);