验证“哥德巴赫猜想在1000内成立分析(简单算法):
主函数的算法:对4到1000之间的偶数进行穷举,验证每一个偶数都可以分解成两个素数的和。(将分解过程单独写成一个函数goldbahe)
函数goldbahe的算法:对于一个偶数even,要想分解成m+n,首先要对m从2至m/2进行穷举,得到其中的一个数m,自然,另外一个数就是n=even-m,然后验证这一对数是否是素数,是的话,得到的m和n就是一组分解,不是继续判断下一组m和n.(这里判断素数可以另写成一个函数prime)
函数prime的算法:对于一个数n,要判断它是否是素数,要从2至sqrt(n)进行穷举,验证每一个数是否能整除n,如果发现能整除的数,说明n不是素数,返回0,否则,继续验证下一个数。直至循环结束返回1.
(解法一:不用指针)#include<stdio.h>
#include<math.h>
int prime(int n); /*函数声明*/
void Goldbach(int even);/*函数声明*/
void main()
{
int i;
for(i=4;i<=1000;i+=2) /*循环验证4-1000之间的每一个正偶数*/
{
Goldbach(i); /*函数调用*/
  if(i%50==0)
{ puts("press \'enter\' to continue");
getchar();
}
/*因为结果较多,中间停顿一次,目的是将结果分两次输出,用户按回车键后继续后半部分结果的输出*/
}
}
int prime(int n) /*函数功能:判断n是否为素数,是返回1,不是返回0*/
{
int i;
for(i=2;i<=sqrt(n);i++) /*在循环中发现有因子,表明不是素数,返回0*/
{
if(n%i==0)
return 0;
}
return 1;/*若循环结束仍未执行到return0,则顺序执行此句,返回1,表明没找到因子,n是素数*/
}
void Goldbach(int even) /*验证even满足哥德巴赫猜想:将EVEN分解为m和n,并输出*/
{
int m,n;/*两变量分别用于存储分解的两数*/
for(m=2; m<=even/2; m++) /*对第一个数的可能性进行穷举*/
{ n=even-m; /*根据第一个数得到第二个数*/
if(prime(m)&&prime(n)) /*若两数均为素数,表示找到一组分解,输出并返回*/
{ printf(“%d=%d+%d”,even,m,n);
return;
}
}
}
解法二 (用指针)#include<stdio.h>
#include<math.h>
int prime(int n); /*函数声明*/
void Goldbach(int even,int *a,int *b); /*函数声明*/
void main()
{ int i;
int m,n;
for(i=4;i<=10000;i+=2) /*循环验证4-1000之间的每一个正偶数*/
{
Goldbach(i,&m,&n); /*函数调用:对i进行分解,并将m,n的地址传递给形参,则函数中可以通过形参对m,n进行间接引用,分解结果直接写入m,n*/
printf("%d=%d+%d\n",i,m,n);
  if(i%50==0) /*因为结果较多,中间停顿一次,目的是将结果分两次输出,用户按回车键后继续后半部分结果的输出*/
{ puts("press \'enter\' to continue");
getchar();
}
}
}
int prime(int n) /*函数功能:判断n是否为素数,是返回1,不是返回0*/
{ int i;
for(i=2;i<=sqrt(n);i++)/*在循环中发现有因子,表明不是素数,返回0*/
{ if(n%i==0)
return 0;
}
return 1;/*若循环结束仍未执行到return0,则顺序执行此句,返回1,表明没找到因子,n是素数*/
}
/*验证even满足哥德巴赫猜想,并将分解的两个素数写到a,b指向的主调函数的变量中。*/
void Goldbach(int even,int *a,int *b)
{ int m,n;/*两变量分别用于存储分解的两数*/
for(m=2; m<=even/2; m++) /*对第一个数的可能性进行穷举*/
{ n=even-m; /*根据第一个数得到第二个数*/
if(prime(m)&&prime(n))
/*在此函数中嵌套调用prime()若两数均为素数,表示找到一组分解*/
{ *a=m; /*将结果写入主函数a,b指向的主调函数的变量中*/
*b=n;
return;/*返回,因为结果已经通过上步写回去,因此只是返回到主调函数,不带回有用的数值*/
}
}
}
/*该函数也可写成如下形式:与上边的区别即直接用*a,*b,未用m,n变量进行过渡
void bahe(int even,int *a,int *b)
{for(*a=2;*a<= even/2;*a++)
{ *b=even-*a;
if(prime(*a)&&prime(*b))/*在此函数中嵌套调用prime()*/
{ return; }
}
}
*/