求两个正整数的最大公约数——辗转相减法

  问题:求解两个正整数的最大公约数

  今天第一节形式化方法课,举了一个简单的例子——辗转相减法求解两个正整数的最大公约数,来讲解形式化方法的基本内容,让我们有感性的认识。其基本思路如下:

    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

求两个正整数的最大公约数——辗转相减法的相关文章

求两个正整数的最大公约数和最小公倍数(java)

1 package com.hpu.bai; 2 3 import java.util.Scanner; 4 5 public class Common { 6 public int mincom(int m,int n){ 7 int temp;int t = 0; 8 if(m<n){ 9 temp = n; 10 n =m; 11 m =temp; 12 } 13 if(m%n ==0) return n; 14 else 15 return mincom(m-n,n); 16 } 17

欧几里德算法(求两个正整数的最大公约数)

/*欧几里德算法:辗转求余  原理: gcd(a,b)=gcd(b,a mod b)  当b为0时,两数的最大公约数即为a getchar()会接受前一个scanf的回车符*/ #include<stdio.h> void main(){    int temp;    int a,b;    scanf("%d",&a);    scanf("%d",&b);    printf("the greatest common fa

求两个正整数的最大公约数的函数

求最大公约数的欧几里得算法是一个递归算法,据说出现在公元前375年,或许是最早的递归算法实例: gcd(x, y) =  x ;                            (y = 0) = gcd(y, x mod y);         (y > 0) 注:mod是求模,相当于程序中的%. int gcd(int x, int y)                    //最终返回x,y的最大公约数 { return y?gcd(y, x/y):x;        //递归,用

C语言实验报告(五) 两个正整数的最大公约数

编程实现求两个正整数的最大公约数,要求计算最大公约数用函数fun(int a,int b)实现. #include<stdio.h>void main(){  int n,a,b;  int fun(int a,int b);  printf("please input a,b:");  scanf("%d,%d",&a,&b);  n=fun(a,b);  printf("%d,%d的最大公约数为%d",a,b,n)

算法 - 求两个自然数的最大公约数(C++)

placeholder算法 - 求两个自然数的最大公约数(C++),布布扣,bubuko.com

求两个整数的最大公约数

<C和指针>第7章第2道编程题: 两个整型值M和N(M.N均大于0)的最大公约数可以按照下面的方法计算: 请编写一个名叫gcd的函数,它接受两个整型参数,并返回这两个数的最大公约数.如果这两个参数中的任何一个不大于零,函数返回零. 1 /* 2 ** 求两个整数的最大公约数 3 */ 4 5 #include <stdio.h> 6 7 int gcd( int M, int N ); 8 9 int 10 main() 11 { 12 int m, n; 13 scanf( &q

T-SQL编写程序,采用辗转相除法求解两个正整数的最大公约数

--T-SQL编写程序,采用辗转相除法求解两个正整数的最大公约数 declare @m int ,@n int select @m=12,@n=21 declare @t int ,@r int print cast(@m as varchar(5))+'和'+cast(@n as varchar(5))+'的最大公约数为:' --if @m<@n -- select @[email protected],@[email protected],@[email protected] set @[e

求两个整数的最大公约数和最小公倍数

//求最大公约数是用辗转相除法,最小公倍数是根据公式 m,n 的 最大公约数* m,n最小公倍数 = m*n 来计算 #include<stdio.h> //将两个整数升序排列 void ascNum(int *p1,int *p2) { int temp; if(*p1 > *p2) { temp = *p2; *p2 = *p1; *p1 = temp; } } //求两个整数的最大公约数 辗转相除法 int getAppr(int a, int b) { int c; ascNum

002:求两个整数的最大公约数和最小公倍数

求最大公约数可采用辗转相除法,其流程如图所示. 最小公倍数就是两个整数的乘积除以其最大公约数. 1 #include <stdio.h> 2 3 int main() 4 { 5 unsigned long a, b, c=0; //两个整数和临时变量 6 unsigned long lcm=0, gcd=0; //最小公倍数和最大公约数 7 8 while( 1 ) 9 { 10 printf("Please input two positive integers(spacebar