使用函数验证哥德巴赫猜想:任何一个不小于 6 的偶数均可表示为两个奇素数之和。
如 6=3+3,8=3+5,…,18=5+13。
将 6~100 之间的偶数都表示成两个素数之和,打印时一行打印 5 组。试编写相应程序。
分析:
- 需要一个判断素数的函数用来判断素数。(除2以外,凡是素数必是奇数)
- 其次需要一个循环变量以3(最小奇素数)为起始,每次循环给变量加2的循环,确保为奇数;再使用素数判断函数来判断是否为素数。
- 同时,将满足为奇素数的循环变量作为加项之一。
- 将所给偶数减去奇素数即为另一个加项,判断此加项是否为奇素数,若是,则满足“偶数=奇素数+奇素数”条件,进行输出。
- 所有情况输出完毕,进行下一个偶数验证。
程序如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>//malloc
int prime(int m);
int main() {
int start = 6, finsh = 100, count=0;
while (start <= finsh)
{
for (int i = 3; i <= start; i+=2)
{
//最小奇素数为3,且奇数不一定是素数,需要判断
if (prime(i) && prime(start - i))
{
/*if (i > (start - i))
{
break;
}*/
printf("%d=%d+%-4d\t", start, i, start - i);
count++;
if (count % 5 == 0)
{
printf("\n");
}
}
}
start += 2;//保证为偶数
}
return 0;
}
int prime(int m)
{
//素数:只有1和它本身能被其整除,1不是素数,2是素数
for (int i = 2; i < m; i++)
{
if (m % i == 0)
{
return 0;
}
}
return 1;
}
可以发现,输出结果带有顺序不同但内容相同的重复项。
为了排除重复项,进行验证:若两项均为符合条件的奇素数,因为前项是从3开始增加,即当前项大于后项情况下输出的等式均为顺序不同但内容相同的重复项。故此时应结束当前循环。
将上一程序第 17 行开始处 if 判断程序取消注释:
if (i > (start - i))
{
break;
}
修改程序后结果如下: