算法设计与分析之求两个数的最大公约数
题目:给定两个自然数m,n,求他们的最大公约数。
三种算法及其思想:
蛮力法:
思想:
逐个尝试2-min{m,n},找到的最大的数即为m和n的最大公约数;如果没找到,则m和n的最大公约数为1.
伪代码描述:
输入:两个自然数 m,n
输出:m和n的最大公约数
1.factor=1;
2.循环变量i从2~min{m,n},执行下述操作:
2.1 如果i是m和n的公因子,执行下述操作:
2.2.1 factor=factor*i;
2.2.2 m=m/i;n=n/i;
2.2 如果i不是m和n的公因子,则i=i+1;
3.输出factor
C语言:#includeint main(){ int m,n; printf("请输入两个自然数"); scanf("%d %d",&m,&n); int CommFactor1{ int i,factor=1; for(i=2;i<=m && i<=n;i++) { while(m%i==0 && n%i==0) { factor=factor*i; m=m/i;n=n/i; } }printf("m和n的公因数为%d\n",factor);}CommFactor1(m,n);return 0;}
输出结果:
欧几里得算法(辗转相除法)
思想:
定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数
伪代码描述:
输入:两个自然数 m,n
输出:m和n的最大公约数
1.r=m%n
2.循环直到i=0
2.1 m=n
2.2 n=r
2.3 r=m%n
3.输出n
c语言:#include<stdio.h>int main(){ int m,n; printf("请输入两个正整数:"); scanf("%d %d",&m,&n); int CommFactor2(){ int r= m%n; while(r !=0) { m=n; n=r; r=m%n; } printf("最大公约数是为%d\n",n);
} CommFactor2(m,n);}
输出结果:
相减法
思想:
在欧几里得算法的思想中,把除法换成减法
伪代码描述:
输入:两个自然数 m,n
输出:m和n的最大公约数
1.先m-n是否为0,若不为0,执行2;若为0,则输出其中的一个,即为公约数
2.r=m-n;m=n;n=r;(m>n);再执行1
C语言:#include<stdio.h>int main(){ int m,n; printf("请输入两个正整数:"); scanf("%d %d",&m,&n); if(m==n) printf("最大公约数为%d",m); while(m!=n) if(m>n) { m=m-n; } else { n=n-m; } printf("最大公约数是为%d\n",n); }
输出结果:
三种算法的时间复杂度分析:
欧几里得算法所用时间最短,蛮力法所用时间最长(不适用于数据较大的情况)。