当前位置:编程学习 > C/C++ >>

c++ 代码 帮忙注释一下

2010.10.11

#include <iostream.h>

#define  M  10001                         

void CreatPrimeList(int PrimeList[])

{

       int i, j;

              for(i=0; i<M; i = i+1)

              PrimeList[i] = i;    

       i = 2;

       while(i<M/2)

       {

              for(j=i+1; j<M; j=j+1)

                     if(PrimeList[j]!=0 && PrimeList[j]%PrimeList[i]==0)

                            PrimeList[j] = 0;

                            i = i+1;

                     while(PrimeList[i]==0)

                            i = i+1;

       }

}

int NextPrimeNumber(int p, int PrimeList[])

{

       p = p+1;

       while(PrimeList[p]==0)

              p = p+1;

       return PrimeList[p];

}

int main()

{

       int PrimeList[M];                

       int x, p;                              

       CreatPrimeList(PrimeList);

       x = 4;

       while(x<M)

       {

              p = PrimeList[2];

              while(p<=x/2 && PrimeList[x-p]==0)

                     p = NextPrimeNumber(p,PrimeList);

                     if(p>x/2) 

                     cout<<"Great discovery: Goldbach is wrong!"<<endl;

              else     

                     cout<<"The even number "<<x<<"="<<p<<" + "<<x-p<<endl;

                     x = x+2;

       }

       return 0;

}

 

答案:

/*
总体而言,这个程序的作用是实现将10000以内大于2的偶数分解为两个素数的和的形式。
从数学角度,就是证明哥德易做图猜想在充分大的数不大于10000的情况下成立。
*/
//2010.10.13
#include <iostream>
#define  M  10001 
using namespace std;                       
void CreatPrimeList(int PrimeList[])  //这个函数的作用是制作一个素数表
{
 int i, j;
 for(i=0; i<M; i = i+1) PrimeList[i] = i; //数表初始化
 i = 2;
 while(i<M/2)//这种找素数的方法我们成为”筛法“,就是将基数PrimeList[i]的倍数全部排除掉
 {
  for(j=i+1; j<M; j=j+1)
   if(PrimeList[j]!=0 && PrimeList[j]%PrimeList[i]==0)  //当PrimeList[j]不为0且会被PrimeList[i]整除
    PrimeList[j] = 0;  //简单的说,当PrimeList[j]为合数时,令PrimeList[j]为0
  i = i+1;
  while(PrimeList[i]==0)  //设置PrimeList[i]为下一个未被排除数字
   i = i+1;
 }
}

int NextPrimeNumber(int p, int PrimeList[]) //用于返回下一个质数,p是当前的
{
 p = p+1;
 while(PrimeList[p]==0) 
  p = p+1;
 return PrimeList[p];    //返回数组PrimeList中下一个非0值
}

int main()
{
 int PrimeList[M];             //定义数组,用于存放质数表   
 int x, p;                     
 CreatPrimeList(PrimeList);    //调用CreatPrimeList函数,由于传的参数
 x = 4;
 while(x<M)
 {
  p = PrimeList[2];  //设置p初始值为PrimeList[2]即2
  while(p<=x/2 && PrimeList[x-p]==0)  //如果x-p不是素数,
   p = NextPrimeNumber(p,PrimeList);  //查找下一个素数,直到p和x-p都是素数
  if(p>x/2) 
   cout<<"Great discovery: Goldbach is wrong!"<<endl;
  else     
   cout<<"The even number "<<x<<"="<<p<<" + "<<x-p<<endl;
  x = x+2;
 }
 system("pause");  //防止程序一闪而过,看不到结果
 return 0;
}
/*
其实这个程序写的不是很好,素数表占用空间太大,而且求素数的算法也不省时间。
如果还有什么疑问,欢迎追问。
*/

上一个:求汉诺塔的C++代码
下一个:高手帮忙改改C++代码

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,