关于查寻质数最高效、最快捷的算法

关于查找质数最高效、最快捷的算法
#include "stdio.h"
#define bianjie 70

void main()
{
    char sieve[bianjie];
    char *p;
    int number;
    
    for(p=sieve;p<&sieve[bianjie];) *p++=1;
    
    for(number=3; ; number+=2)
    {
     p=&sieve[0]+(number-3)/2;
    
     if(p>=&sieve[bianjie]) break;
    
     while(p<&sieve[bianjie])
       p+=number,*p=0;
    }
    
    printf("2\n");
    for(number=3,p=sieve; p<&sieve[bianjie]; number+=2,p++)
      if(*p!=0)
     printf("%d\n",number);
}

这是一版在固定范围内查找质数最牛叉的算法,但程序运行时却出现一个很奇怪的现象:在我的电脑上,这段代码不报任何错但没有任何运行结果,可是如果我把宏定义【bianjie】的值改的比较小一点,比如60,那么程序就可以正常打印出结果:关于查寻质数最高效、最快捷的算法

请问网友这是什么原因造成的?无法回答的话,请把上面那段代码复制在您的机器上运行,看是否有结果显示。
------解决方案--------------------
while(p<&sieve[bianjie])
          p+=number,*p=0;
判断了p没有越界,但不能保证p+number没有越界,在执行*p=0会可能因为越界写入到相邻的局部变量。
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

毫无疑问是 p+=number,*p=0; 越界

其次我用的vs2008, p,number,sieve并不是像lz那样的内存排列,编译出来的结果是number地址排在第一,sieve数组排在后面,p排在数组的后面

p+=number大于bianjie之后,p指向了自己的内存上,然后*p=0,把p指向的地址改成了一个非法的地址,然后程序挂掉了。bianjie定为60同样没有得出最终结果


  事情变得有意思了,看这张图片:
关于查寻质数最高效、最快捷的算法
结合上下文环境,一个貌似毫无疑问的事实是——程序必须执行第22句代码。但显然我的机器见鬼了,这句代码竟然直接被机器无视掉!!
  所以,有没有高手能告诉我:什么样的原因可以造成这种奇怪现象【很像是病毒类的吧?】??

附言:下面是一模一样的源代码,有心的朋友可以在自己机器上试一下。
#include "stdio.h"
#define bianjie 70
 
void main()
{
    char sieve[bianjie];
    char *p;
    int number;
     
    for(p=sieve;p<&sieve[bianjie];) *p++=1;
     
    for(number=3; ; number+=2)
    {
        p=&sieve[0]+(number-3)/2;
         
        if(p>=&sieve[bianjie]) break;
         
        while(p<&sieve[bianjie])
          p+=number,*p=0;
    }
     
    printf("为什么不执行这句代码??");
    
}


当p值被改掉, p永远小于&sieve[bianjie])的时候, 你的for(number=3; ; number+=2)就是一个死循环,printf肯定得不得执行,
不信你可以在if(p>=&sieve[bianjie]) break;打印p的值

关于查寻质数最高效、最快捷的算法


那就是更悲剧的代码段的地址被你的p修改掉了 

但是 lz 你的程序在你电脑上你能运行处结果, 在我的电脑上是直接挂掉的
关于查寻质数最高效、最快捷的算法

while(p<&sieve[bianjie])
          p+=number,*p=0;

应该改为
while(p<&sieve[bianjie])
{
p+=number;
if (p<&sieve[bianjie])
{
*p=0;
}
}
 才有正确结果
------解决方案--------------------
跟代码段无关,问题就在于数组越界和楼主毫不在乎的“那个未知的神秘内存”
简单跟踪了一下,虽然没有仔细分析栈中每个数据的意义,但从该位置修改前的数值来看存放的应该是ESP(栈顶指针),这个数值被修改,使得筛法查找质数这个循环结束后数据出栈时位置错乱,而楼主的集成编译环境又不怎么给力,不报错直接结束了整个程序
------解决方案--------------------
个人感觉查表法才是最快的方法关于查寻质数最高效、最快捷的算法
------解决方案--------------------
Finding prime numbers - Kenneth Haugland
Different schemas for finding prime numbers explained with code
http://www.codeproject.com/Article.aspx?tag=198374988322054872&

------解决方案--------------------
23L的观点有失偏颇哦。
主攻编程的话,稍微像样点的资料都是英文的。