实验4-2-3 验证“哥德巴赫猜想” (20分)

数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。

输入格式:
输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。

输出格式:
在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。

输入样例:

24

输出样例:

24 = 5 + 19

错解

双向链表构造素数表

原因:
1.构造素数表存储了过多的无关数据,导致内存溢出

2.判断素数的算法时间复杂度太大,导致运行超时

正解:用两个单独的int存储头尾值,边运算边判断

改进判断素数的算法,时间复杂度从O(N^3)降到了O(sqrt(n)),解决了运行超时问题

代码中的素数判断操作用到了这篇博客里面的算法

//验证“哥德巴赫猜想”
#include <stdio.h>
#include <math.h> int check(int x); int main (void)
{
int start = 2;
int end;
int n;
int i=0;
scanf("%d", &n);
end = n-1;
while(start<=end){
if(start+end==n){
printf("%d = %d + %d", n, start, end);
break;
}
if(start+end>n){
do{
if(end==3){
end--;
}else{
end -= 2;
}
}while(check(end));
}else if(start+end<n){
do{
i++;
start = 2*i+1;
}while(check(start));
}
}
return 0;
} int check(int x)
{
int i;
int tmp;
if(x==2 || x==3){
return 0;
}
if(x%6 != 1 && x%6 != 5){
return 1;
}
tmp = sqrt(x);
for(i=5;i<=tmp;i+=6){
if(x%i==0 || x%(i+2)==0){
return 1;
}
} return 0;
}

最新文章

  1. Python 正则表达式入门(初级篇)
  2. ListAdapter列表适配器
  3. apache EnableMMAP指令
  4. 常见linux命令释义(第二天)
  5. SinalR+WebSocket
  6. hibernate tool连接oracle生成pojo和xml文件无法查询表解决办法
  7. PyDev for Eclipse 简介
  8. Python基础:1.数据类型(元组)
  9. 查找无用代码Dead Code的一些心得
  10. Flie类
  11. UNDO表空间损坏,爆满,ORA-600[4194]/[4193]错误解决
  12. js原型解析
  13. [ES6] Promise
  14. LeetCode_Jump Game
  15. UVA 10057 A mid-summer night&#39;s dream. 仲夏夜之梦 求中位数
  16. ORACLE:plsql优化
  17. Sublime常用插件
  18. 完整CentOS搭建OpenVPN服务详细教程
  19. SpringMVC,SpringBoot文件下载
  20. JavaScript深拷贝

热门文章

  1. 4.React生命周期
  2. Linux下sed找出IP中第四位
  3. Kubernetes环境Traefik部署与应用
  4. Vue组件传值(一)之 父子之间如何传值
  5. 6步快速配置Tomcat环境变量(Win10)
  6. Devexpress 饼状图
  7. ldconfig与 /etc/ld.so.conf
  8. 使用SQL SERVER存储过程实现历史数据迁移
  9. 洛谷P1781——宇宙总统(高精度排序)
  10. Django学习day07随堂笔记