分类：电脑/网络-程序设计-C/C++
问题：看一下这个程序(求100以内的质数),怎么简化一下算法这是个求N 
这是个求N以内的质数的(可以通过改变size值来改变求值范围,但最好在100万以内,否则会死机).程序虽然不长,但在第2个for循环中有大量的重复操作,十分影响效率.如在第一次i=3时会将所有的数组下标为3的倍数赋予false(如12),但当i=4时,还会将p[12]赋予false,这样的重复赋值十分影响效率,尤其是在求一个很大范围内的质数时,速度会很慢,谁能帮我简化一下算法.#define size 100#include<iostream.h>void main (){  bool p[size];  int i这是个求N以内的质数的(可以通过改变size值来改变求值范围,但最好在100万以内,否则会死机).程序虽然不长,但在第2个for循环中有大量的重复操作,十分影响效率.如在第一次i=3时会将所有的数组下标为3的倍数赋予false(如12),但当i=4时,还会将p[12]赋予false,这样的重复赋值十分影响效率,尤其是在求一个很大范围内的质数时,速度会很慢,谁能帮我简化一下算法.#define size 100#include<iostream.h>void main (){  bool p[size];  int i;  cout<<size<<"以内的质数有"<<endl<<2;  for(i=3;i<size;i++)    p[i]=true;  for(i=3;i<size;i++)    if(p[i]){      cout<<" "<<i;      for(int j=i+i+i;j<size;j+=i+i)        p[j]=false;    }    cout<<endl;}
回答：简化寻找质数的1.跳过一些数.如偶数.另外对于摸6同余的数(表示为6n，6n+1，6n+2，6n+3，6n+4，6n+5),只需要测试6n+1和6n+5是否为质数，这样问题规模缩小为原来的三分之一2.只需要用已经找到的质数去测试整除性<参考代码：由小到大找出制定数目的素数>#include  <stdio.h>#define   MAXSIZE    100#define   YES          1#define   NO           0void main(void){     int  prime[MAXSIZE];     /* array to contains primes */     int  gap = 2;            /* increasing gap = 2 and 4 */     int  count = 3;          /* no. of primes            */     int  may_be_prime = 5;   /* working  variable        */     int  i, is_prime;     prime[0] = 2;            /* Note that 2, 3 and 5 are */     prime[1] = 3;            /* primes.                  */     prime[2] = 5;     while (count < MAXSIZE)  { /* loop until prime[] full*/          may_be_prime += gap;  /* get next number        */          gap           = 6 - gap; /* switch to next gap  */          is_prime      = YES;  /* suppose it were a prime*/          for (i = 2; prime[i]*prime[i] <= may_be_prime && is_prime; i++)               if (may_be_prime % prime[i] == 0) /* NO    */                    is_prime = NO; /* exit                */          if (is_prime)       /* if it IS a prime...      */               prime[count++] = may_be_prime;  /* save it */     }     printf("\nPrime Number Generation Program");     printf("\n===============================\n");     printf("\nFirst %d Prime Numbers are :\n", count);     for (i = 0; i < count; i++) {          if (i % 10 == 0) printf("\n");          printf("%5d", prime[i]);     }}