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

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

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


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


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


我们来看一个程序需求:


验证哥德巴赫猜想:任何一个大于 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

相关文章
|
7月前
|
程序员 C#
C#编程中的面向对象编程思想
【4月更文挑战第21天】本文探讨了C#中的面向对象编程,包括类、对象、封装、继承和多态。类是对象的抽象,定义属性和行为;对象是类的实例。封装隐藏内部细节,只暴露必要接口。继承允许类复用和扩展属性与行为,而多态使不同类的对象能通过相同接口调用方法。C#通过访问修饰符实现封装,使用虚方法和抽象方法实现多态。理解并应用这些概念,能提升代码的清晰度和可扩展性,助你成为更好的C#程序员。
104 4
|
7月前
|
Serverless 对象存储 C++
第十三章:C++面向对象编程思想详解
第十三章:C++面向对象编程思想详解
136 0
|
存储 Java 编译器
面向对象的思想(2)
面向对象的思想(2)
81 0
|
设计模式 关系型数据库 区块链
|
设计模式 SQL 开发框架
【Java设计模式 面向对象设计思想】八 面向对象设计思想小结
【Java设计模式 面向对象设计思想】八 面向对象设计思想小结
84 0
|
设计模式 前端开发 安全
【Java设计模式 面向对象设计思想】二 再谈面向对象和面向过程
【Java设计模式 面向对象设计思想】二 再谈面向对象和面向过程
100 0
|
存储 设计模式 安全
【Java设计模式 面向对象设计思想】七 面向对象分析、面向对象设计和面向对象编程
【Java设计模式 面向对象设计思想】七 面向对象分析、面向对象设计和面向对象编程
199 0
|
存储 设计模式 前端开发
【Java设计模式 面向对象设计思想】四 基于接口而非实现编程
【Java设计模式 面向对象设计思想】四 基于接口而非实现编程
104 0
|
关系型数据库
面向对象的设计(OOD)原则了解一下
面向对象的设计(OOD)原则了解一下
220 0
|
网络协议 测试技术 Go
面向对象编程思想-抽象 | 学习笔记
快速学习面向对象编程思想-抽象
面向对象编程思想-抽象 | 学习笔记