【编程思想】自顶向下 逐步求精

简介: 面向过程化编程思想:自顶向下 逐步求精从程序执行的过程入手,将完整的过程细化成多个子过程,再将子过程细化,直到完成代码。

【编程思想】自顶向下 逐步求精


面向过程化编程思想:自顶向下 逐步求精


从程序执行的过程入手,将完整的过程细化成多个子过程,再将子过程细化,直到完成代码。


我们来看一个程序需求:


验证哥德巴赫猜想:任何一个大于 6 的偶数,都能分解成两个质数的和。质数,指的 是除了 1 和本身之外,没有别的因子的数。


要求:输入一个整数,输出这个数能被分解成哪两个质数的和。


例如 : 输入 14


14=3+11


14=7+7


这是一个比较复杂的程序。拿到这个程序的需求之后,首先应该先设计出程序的大体思路。


基本思路如下:


1、读入一个整数 n


2、把这个整数拆成两个数 a、b 的和


3、判断 a 是否是质数


4、判断 b 是否是质数


5、如果 3、4 两个判断都为真,则输出 a 和 b


6、如果这个整数还能拆分,则回到第 2 步。否则程序退出


很显然,2~6 步是一个循环,调整一下结构


如下: 读取整数 n 循环(把整数 n 拆成两个整数 a 和 b){


 判断 a 是否是质数


判断 b 是否是质数


如果 a、b 都是质数,则输出 a 和 b


}


在上面的基本思路中,我们可以看到,“判断 a 是否是质数”和“判断 b 是否是质数”这两步操作基本一样。因此,很显然,这里我们应该写出一个函数,这个函数能够判断一个整数是否是质数。


import java.util.Scanner;
public class TestGoldBach{
  public static void main(String args[]){
  //读入整数
  Scanner sc = new Scanner(System.in);
  int n = sc.nextInt();
  循环{
    int a = 第一个整数
    int b = 第二个整数
  if (isPrime(a) && isPrime(b)){
  System.out.println(n + "=" + a + "+" + b);
    }
    }
  }
  //判断一个整数是否是质数
  public static boolean isPrime(int a){
  }
}


继续细化。现在我们关注的重点是两个:


1、如何把一个整数 n 拆成两个整数 a 和 b;


2、如何判断一个整数是质数。


 首先,我们来看拆数的逻辑。如果能够确定一个整数 a,则另外一个整数 b 也就确定 了,可以通过 b = n – a 这个式子计算出 b 的值。那么如果给出一个整数,如何确定 a 的值呢?我们可以先看一个例子。假设 n 为 14,则所有拆数的拆法是:


1 + 13


2 + 12


3 + 11


4 + 10


5 + 9


6 + 8


7 + 7


在往下就是重复的拆法了。这样,我们把第一个数当做 a,则 a 从 1 变化到 7,也就是 变化到 14/2。于是,我们拆数的循环就能够分析出来了:

for(int i = 1; i<=n/2; i++){
    int a = i;
    int b = n-i;
  if (isPrime(a) && isPrime(b)){
  System.out.println(n + "=" + a + "+" + b);
  }
  }



至此,主函数全部完成。接下来,完成 isPrime 方法。对于如何判断一个整数是否是质数,我们依然使用自顶向下,逐步求精的方式。由于质数,指的是除了 1 和本身之外,没 有其他的因子,因此判断一个整数 a 是否是质数,只要看 2~a-1 的范围内有没有 a 的因子就可以了。


因此,主要思路如下:


循环 i : 2~a-1{


如果 i是 a 的因子,则说明 a 不是质数 } 循环结束


则说明 2~a-1 都不是 a 的因子,因此 a 是质数


完整代码如下:

package p5;
import java.util.Scanner;
public class TestGoldBach2{
  public static void main(String args[]){
  //读入整数
  System.out.println("请输入一个整数");
  Scanner sc = new Scanner(System.in);
  int n = sc.nextInt();
  for(int i = 1; i<=n/2; i++){
    int a = i;
    int b = n-i;
    if (isPrime(a) && isPrime(b)){
    System.out.println(n + "=" + a + "+" + b);
    }
    }
  }
  //判断一个整数是否是质数
  public static boolean isPrime(int a){
  for(int i=2; i<= a-1; i++){
    if (a % i == 0) return false;
    }
    return true;
  }
}


运行结果如下:

image.png

相关文章
|
SQL 分布式计算 Hadoop
Azkaban【基础 01】核心概念+特点+Web界面+架构+Job类型(一篇即可入门Azkaban工作流调度系统)
【2月更文挑战第6天】Azkaban【基础 01】核心概念+特点+Web界面+架构+Job类型(一篇即可入门Azkaban工作流调度系统)
1111 0
|
存储 异构计算
Verilog RAM/ROM的数据初始化
Verilog RAM/ROM的数据初始化
|
存储 算法 关系型数据库
|
定位技术 索引
osgEarth使用笔记3——加载倾斜摄影数据
osgEarth使用笔记3——加载倾斜摄影数据
663 1
|
边缘计算 Kubernetes 持续交付
构建高效后端系统:面向未来的架构设计原则
【8月更文挑战第8天】在技术飞速发展的今天,后端系统的架构设计显得尤为关键。本文将探讨如何通过采用微服务、容器化及自动化等现代技术手段,来构建一个可扩展、高可用且易于维护的后端系统。我们将深入分析这些技术背后的原理及其在实际场景中的应用,同时也会讨论如何在保障数据一致性和系统安全性的前提下,提升系统的响应速度和处理能力。
|
存储 关系型数据库 MySQL
mysql optimizer_switch : 查询优化器优化策略深入解析
mysql optimizer_switch : 查询优化器优化策略深入解析
|
调度 索引
OSG加载倾斜摄影数据
OSG加载倾斜摄影数据
295 0
|
开发者
Cmake库导入脚本:使用 CMakeLists.txt 创建自定义的库导入脚本
Cmake库导入脚本:使用 CMakeLists.txt 创建自定义的库导入脚本
261 2
|
测试技术 项目管理 数据库
【软件设计师备考 专题 】软件生存期模型:瀑布、螺旋与喷泉
【软件设计师备考 专题 】软件生存期模型:瀑布、螺旋与喷泉
508 0
|
存储 机器学习/深度学习 负载均衡
使用Swing算法实现商品推荐
使用Swing算法实现商品推荐
5828 3
使用Swing算法实现商品推荐