哥德巴赫猜想――(C语言)之妙趣横生的算法

标签: 哥德巴赫猜想-算法 添加标签>>


wKiom1MoJ63TK9SVAABJjjMD_Ao936.jpg最近小鸟我没找到什么好看的Linux书籍,无聊时就向老师借了本《零基础学算法》这本书,顿时找到了感觉,呵呵!在这就给大家分享个算法吧! w_0039.gif


“1742年,哥德巴赫在教学中发现,每个不小于六的偶数都是两个素数之和。例如:

6=3+3

12=5+7

大数学家欧拉相信这个猜想是正确的,但他不能证明。叙述如此简单的问题,连欧拉这样首屈一指的数学家都不能证明,这个猜想便引起了许多数学家的注意。从哥德巴赫提出的这个猜想至今,许多数学家都不断努力向攻克它,但都没有成功。”

  当然曾今有人做了些具体的验证,例如:

首先验证:6=3+3;

接着验证:8=3+5;

接着检验:10=5+5;

......

     对于隔得巴赫猜想的验证,小鸟的基本思路是:设n为大于等于6的一个偶数,可将其分解为n1和n2两个数,分别检验n1和n2是否为素数,若都是,则该数得到验证。若n1不是素数,就不必再检查n2是否为素数。先从n1=2开始,检验n1和n2(=n-n1)是否为素数。然后使n1+2再检验n1,n2是否为素数......,直到n1=n/2为止。

      根基上面的思路,小鸟用C(目前小鸟只会C,别笑哦!j_0057.gif)写出了如下的算法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<stdio.h>
#include<stdlib.h>
int CreatPrime( int n, int prime[])                                   //用筛选法得到素数数组
{
int i,j;
for (i=2;i<=n;i++)                                       //初始化数组
prime[i]=1;                                     //标识为1表示对应的数为质素
for (i=2;i*i<=n;i++)                                   //循环处理前i个
{
if (prime[i]==1)                               //若为素数
{
for (j=2*i;j<=n;j++)                 //筛去合数
{
if (j%i==0)                 //能被整除
prime[j]=0;       //不是素数
}
}
}
}
int main()
{
int n,i,j,flag;
int *prime;                                 //定义保存素数的数组
printf ( "输入一个最大范围n(n>=6):" );
scanf ( "%d" ,&n);
if (n<6)                                                 //判断输入数据是否合法
{
printf ( "数据输入错误!\n" );
return 0;
}
if (!(prime=( int *) malloc ( sizeof ( int )*n)))                         //分配内存保存素数
{
printf ( "分配内存失败!\n" );
getch();
return 0;
}
Createprime(n,prime);                                                     //生成素数数组
for (i=6;i<=n;i++)                                                         //从6开始,循环验证各偶数
{
flag=1;
for (j=2;j<=i/2;j++)                                               //判断组成每个数的两个加数                                          
{
if (j%2==0 ||((i-j)%2==0))                                     //若一个加数为偶数,则不进行素数判断
continue ;
if (prime[j]==1 && prime[i-j]==1)                                 //若两个加数都是素数
{
printf ( "%d=%d+%d\n" ,i,j,i-j);                             //输出素数
flag=0;                             //清除标志
break ;
}
}
if (1==flag)                                                                 //若某个偶数不是由两个奇数组成
printf ( "找到一个不符合要求的偶数:%d\n" ,i);
}
getch();
return 0;
}


好了,让我们一起来总结一下这个算法吧:    wKioL1MoO7SDpROWAABlGNZDxuo022.jpg

这个程序主其实主要用到了 for循环和if判断以及函数的调用;主要是循环与判断如何搭配好,在这就是要注意循环结束的标志,而且要选好判断点


你可能感兴趣的:(linux)