文章目录

  • 前言
  • 一、素数表
  • 二、验证哥德巴赫猜想(基础版)
  • 三、筛选法求素数
  • 四、验证哥德巴赫猜想(加强版)
  • 总结

前言

哥德巴赫猜想是数论中存在最久的未解问题之一。其陈述为:任一大于 2 的偶数都可表示成两个质数之和,例如44=3+41=7+37=13+31。

接下来,我们将用C语言编程验证哥德巴赫猜想,并在其基础上使用以空间换时间的方法来提高算法效率。


一、素数表

要想验证哥德巴赫猜想,就必须先要编程出可以得到素数的函数,在这里我们使用自定义函数 prime() 判断一个数是否为素数,进而打印100以内的全部素数:

#include <stdio.h>
#include <math.h>int prime(int n); //函数声明,判断n以是否为素数 int main()
{for (int i = 2; i < 100; i ++)if (prime(i)) //if(prime(i)!=0:根据函数调用返回值来做出相应判断 printf("%6d", i);return 0;
} // 判断素数函数,是返回1,否返回0
int prime(int n)
{if (n == 1) //1不是素数 return 0;int temp = (int)sqrt(n);for (int i = 2; i <= temp; i++)if (n % i == 0)return 0;return 1; //n是素数
}

二、验证哥德巴赫猜想(基础版)

要想验证哥德巴赫猜想,我们可以调用上一个程序中的自定义函数 prime() ,通过枚举法的思想来验证:
要把偶数分解成两个素数的和,通过循环枚举第一个加数 i ,枚举范围是 3 到 even/2 之间的奇数(even就是要验证的偶数),调用函数 prime() 判断 i 和 even/2 是否都为素数,若不都是素数,则枚举下一个加数,若都是素数,则输出该组合。

实现过程如下:

  1. 声明变量 even , i;
  2. 读入偶数 even 的值;
  3. i 从 3 到 even/2 循环,重复下列操作:若 prime(i) 和 prime(even-i) 同为真,则输出这两个值。
#include <stdio.h>
#include <math.h>int prime(int n);    //函数声明,判断素数 int main()
{int even;scanf("%d", &even);for (int i = 3; i <= even/2; i += 2)if (prime(i) && prime(even-i))printf("%d %d\n", i, even-i);return 0;
} // 判断素数,若是返回1,否则返回0
int prime(int n)
{if (n == 1)return 0;int temp = (int)sqrt(n);for (int i = 2; i <= temp; i ++)if (n % i == 0)return 0;return 1;
}

三、筛选法求素数

以空间换时间是一种很常见的一种提高算法效率的方法。这是一种思想,不是一种算法。这种思想的主要应用有以下两种:第一种是将之前计算的结果保存下来,方便当前计算之用,从而降低计算量;第二种是将所有步骤都需要用到的公共计算部分事先计算好,等真正计算时,只需调用事先计算好的结果就可以了。

素数在很多应用领域都有很重要的用途,寻找一个高效的算法十分重要。例如找出 10000 以内的素数可能仅仅是为某个程序做的准备工作,为提高程序的效率,我们都希望在尽可能短的时间内完成。那么,下面就来介绍一个经典算法——筛选法求素数

所谓筛选法是指从小到大去筛选一个已知素数的所有倍数。以筛选法求 10000 以内的素数为了,根据素数 2 可筛去 4、6、8、··· 、9998、10000 等数,然后根据素数 3 可筛去 9、6、12、15、··· 、9999 等数,由于 4 已经被筛去了,下一个用于筛选的素数是 5 ······ 以此类推,最后剩下的就是 10000 以内的素数。

应用筛选法求素数,为了方便实施 “划去” 操作,应设置数组 isPrime 。每一数组元素 isPrime[i] 赋初值 1 。如果 i 为某数的倍数则应划去,通常将 isPrime[i] 赋值 0。最后,值不为 0 (即没有划去)的元素对应的下标即所求素数。

#include <stdio.h>
#include <math.h>#define N 10000void prime(int n); //调用筛选素数函数
int isPrime[N+1];int main()
{prime(N);for (int i = 0; i <= N; i ++) //输出 10000 以内的所有素数 if (isPrime[i])printf("%5d", i);return 0;
} // 筛选从2到n之间的素数,筛选结果存入数组isPrime
void prime(int n)
{for (int i = 0; i <= n; i ++) //将isPrime数组元素初始化为1 isPrime[i] = 1;isPrime[0] = isPrime[1] = 0; //0和1不是素数 int temp = (int)sqrt(n);for (int i = 2; i <= temp; i ++)if (isPrime[i]) //筛选掉素数的整数倍 for (int j = 2*i; j <= n; j += i)isPrime[j] = 0;
}

四、验证哥德巴赫猜想(加强版)

在上面,我们已经完成了一个验证哥德巴赫猜想的程序,但那只是一个基础版本,下面我们就来使用筛选法优化其成为加强版。

验证方法如下:输入两个整数 a, b(5<a<b<10000),程序将区间[a, b] 中所有偶数都表示成两个素数之和。若某个偶数有多种素数拆分方法,则只输出第一个加数最小的拆分方法。

若 a=38,b=44,则输出为:
38 = 7 + 31
40 = 3 + 37
42 = 5 + 37
44 = 3 + 41

#include <stdio.h>
#include <math.h>#define N 10000void SeparateEven(int n); //将n分成两个素数的和
void prime(int n); //判断素数int isPrime[N+1];int main()
{int a, b;scanf("%d%d", &a, &b);if (a % 2 != 0)a ++;prime(N); //调用筛选素数函数for(int i = a; i <= b; i += 2)SeparateEven(i); //将i表示为两个素数之和 return 0;
} // 将n表示为两个素数之和
void SeparateEven(int n)
{for (int i = 3; i <= n/2; i ++)if (isPrime[i] && isPrime[n-i]) //若两个加数都是素数,则输出n的拆分 {printf("%d = %d + %d\n", n, i, n-i);break;}
}// 筛选从2到n之间的素数,筛选结果存入数组 isPrime
void prime(int n)
{for (int i = 0; i <= n; i ++)isPrime[i] = 1; //将isPrime数组元素初始化为1 isPrime[0] = isPrime[1] = 0; //0和1不是素数 int temp = (int)sqrt(n);for (int i = 2; i <= temp; i ++)if (isPrime[i]) //筛去素数的整数倍 for (int j = 2*i; j <= n; j += i)isPrime[j] = 0;
}

总结

关于素数吧,从学习编程开始,就一直对其进行优化,从一开始的逐字检查,再到遍历到 sqrt(n) ,最后完成筛选法,这一步步下来,收获颇丰啊,想到以后很可能会经常用到,就学一篇笔记来总结下好了,哈哈。

用C语言编程验证 “ 哥德巴赫猜想 ”相关推荐

  1. c语言任何一个大于6的偶数均可表示为两个素数之和,C语言:验证哥德巴赫猜想:任何一个大于6的偶数均可表示为2个素数之和...

    题目: C语言:验证哥德巴赫猜想:任何一个大于6的偶数均可表示为2个素数之和 [问题描述] 验证哥德巴赫猜想:任何一个大于6的偶数均可表示为2个素数之和。例如6=3+3,8=3+5,-,18=5+13 ...

  2. 【C语言】验证哥德巴赫猜想:任何一个大于2的偶数均可表示成为两个素数之和。

    [C语言]验证哥德巴赫猜想:任何一个大于2的偶数均可表示成为两个素数之和. 例如:4=2+2,6=3+3,8=3+5- 要求:将6-100之间的偶数都表示为两个素数之和,输出时一行5组.若有多组结果满 ...

  3. Java编程验证哥德巴赫猜想:任何一个大于6的偶数,都能分解成两个质数的和

    package com.pzhu.demo;import java.util.Scanner;public class Goldbach {//Java编程验证哥德巴赫猜想:任何一个大于6的偶数,都能 ...

  4. 验证哥德巴赫猜想c语言算法,验证哥德巴赫猜想的简单优化

    哥德巴赫猜想:任意一个大于2的偶数,都可以表示为两个素数之和. 验证:2000以内,大于2的偶数,都可以分解为两个素数之和. 分析:2000以内,大于2的偶数为999个,需要逐个判断. 判断过程:对于 ...

  5. c语言表示哥德巴赫猜想,用C语言来验证哥德巴赫猜想(定义的是int型)

    哥德巴赫猜想: 如果任意一个大于6的偶数都可以写成两个素数之和.就将其称为符合哥德巴赫猜想. #include #include /// /// 判断一个数是否是素数 /// /// 要判断的数 // ...

  6. c语言简单验证哥德巴赫猜想

    题目:哥德巴赫猜想中写到,一个充分大的偶数(大于等于4),它可以分解为两个素数(质数)的和. 任务是将输入的偶数n ,分解为两个素数的所有可能打印出来. 例如: 8 = 3 + 5. 20 = 3 + ...

  7. 哥德巴赫猜想c 语言,c++验证哥德巴赫猜想

    哥德巴赫猜想是世界近代三大数学难题之一.1742年,由德国中学教师哥德巴赫在教学中首先发现的.1742年6月7日哥德巴赫把自己的多年实验证明写信给当时的大数学家欧拉,欧拉回信正式提出了以下两个猜想:a ...

  8. (C语言)验证哥德巴赫猜想,输入一个大于6的偶数,输出这个数能被分解为哪两个质数的和

    (C语言)验证哥德巴赫猜想,输入一个大于6的偶数,输出这个数能被分解为哪两个质数的和,如10=3+7,12+5+7. // 质数:除了1和自身,不能被任何数整除的数 #include<stdio ...

  9. C语言入门基础_验证哥德巴赫猜想

    哥德巴赫猜想:任何一个大于6的偶数,都由两个素数相加组成 一.程序设计思路: 任意输入一个大于6的偶数,打印出组成它的两个素数. 例如输入偶数n,使n = i + j,i与j均为素数. 可利用穷举法查 ...

  10. C语言验证哥德巴赫猜想

    验证哥德巴赫猜想: 任何一个大于6的偶数都可以表示成两个素数之和.程序功能:输入一个大于2的偶数,输出该偶数的两个素数加和算式. 如 请输入一个偶数:10 10=3+7=5+5 /*哥德巴赫猜想*/ ...

最新文章

  1. 有些事儿,工程师可能今生仅此一次
  2. Navicat——连接SQL Server数据库方法
  3. Idea问题:“marketplace plugins are not loaded”解决方案
  4. 嵌入式C中,全局变量滥用的后果竟如此严重?
  5. windows找不到文件gpedit.msc_电脑文件搜索神器,没有找不到的东西
  6. endpointimpl怎么填参数_App拉新:以老拉新活动怎么做?
  7. oracle树子类遍历父类_不懂数据库索引的底层原理?那是因为你心里没点b树
  8. 分享:Fedora 删除旧内核
  9. [导入]C#面向对象设计模式纵横谈(21):(行为型模式) Memento 备忘录模式.zip(9.73 MB)...
  10. tp3.2 缓存cache
  11. 【语音合成】基于matlab重叠相加法的信号分帧与还原【含Matlab源码 568期】
  12. snipaste怎么滚动截长图_还在用老方法截长图?分享iPhone滚动截屏方法,无需拼接1秒出图...
  13. 拼音输入法技巧-智能ABC
  14. 小程序登录、微信网页授权(Java版)
  15. 超详细!Jmeter性能测试(一)
  16. 关于最新版mumu模拟器(2.2.16)安装xposed框架
  17. RADARE2+FRIDA=R2FRIDA Best Dynamic Debugging Tool
  18. 全球与中国N-苯基马来酰亚胺粉市场深度研究分析报告
  19. 别再纠结页面设计!挑选小程序页面设计模板就对了
  20. 酷柚易汛进销存商业版,支持独立部署,数据更安全!

热门文章

  1. 全球45个最热门免费下载电子图书的网站
  2. 论K21O Draco开发板的概论
  3. DRAM学习---1
  4. 2.6 如何在新建虚拟机安装搜狗输入法
  5. JAVA笔试面试题集锦05
  6. IE浏览器清除缓存的坑
  7. php阴阳万年历转换的接口,用PHP写的阴阳万年历_PHP
  8. 《周易》乾卦-大象.小象
  9. regedit.exe的命令行使用
  10. 获取任意一个微信小程序码的两种方式