问题:求解两个正整数的最大公约数
今天第一节形式化方法课,举了一个简单的例子——辗转相减法求解两个正整数的最大公约数,来讲解形式化方法的基本内容,让我们有感性的认识。其基本思路如下:
1.任意给定两个正整数a和b;
2.若a和b不相等,则执行第3步;
3.选择a、b中较大者,将较大者与较小者的差赋值给较大者;
4.判断重新赋值后的a和b是否相等,若不相等则继续执行第3步,否则执行第5步;
5.返回a或b。
程序如下(Java编写)。 程序中前断言和后断言是形式化方法中的内容,前断言判断用于计算的数据是否符合要求,后断言确保程序执行的结果是正确的。第一次接触形式化方法,不是太懂,感觉还是蛮有趣的。
1 package com.luop.algorithm; 2 3 /** 4 * 求解两个正整数的最大公约数 5 * @author LuoPeng 6 * 7 */ 8 public class GreatestCommonDivisor { 9 10 /** 11 * 辗转相减法求最大公约数 12 * @param first 第一个正整数 13 * @param second 第二个正整数 14 * @return 0:first或second中有非正整数;-1:出错,返回的正整数不是最大公约数;否则,返回的是first和second的最大公约数 15 */ 16 public int continuousMinus (final int first, final int second) { 17 18 /* 19 * 前断言:判断输入是否有非正整数 20 */ 21 if ( (first <= 0) || 22 (second <= 0) ) { 23 return 0; 24 } 25 26 /* 27 * 辗转相减法求最大公约数我们 28 */ 29 int temp1 = first; 30 int temp2 = second; 31 while ( temp1 != temp2 ) { 32 if ( temp1 > temp2) { 33 temp1 = temp1 - temp2; 34 } else { 35 temp2 = temp2 - temp1; 36 } 37 } 38 39 /* 40 * 后断言:确保程序结果的正确性 41 * 对于任意一个正整数a,如果a满足(first%a==0)&&(second%a==0),则都有temp1>=a 42 */ 43 int count = (first < second)?first:second;//取first和second中较小的数 44 for (int i = 1; i <= count; i++) { 45 if ( (first % i == 0) && 46 (second % i == 0) ) { 47 /* 48 * 如果temp1小于first和second的某个公约数,则说明求得的结果不正确 49 */ 50 if ( temp1 < i ) { 51 return -1; 52 } 53 } 54 } 55 56 /* 57 * 返回结果 58 */ 59 return temp1; 60 61 } 62 63 }
时间: 2024-10-13 23:30:39