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++代码