最近小鸟我没找到什么好看的Linux书籍,无聊时就向老师借了本《零基础学算法》这本书,顿时找到了感觉,呵呵!在这就给大家分享个算法吧!
“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,别笑哦!)写出了如下的算法:
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;
}
|
这个程序主其实主要用到了 for循环和if判断以及函数的调用;主要是循环与判断如何搭配好,在这就是要注意循环结束的标志,而且要选好判断点!
转载于:https://blog.51cto.com/8598676/1398231