算法设计与分析:求两个自然数的最大公约数

算法设计与分析之求两个数的最大公约数

题目:给定两个自然数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语言:
#include
int 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);
}
输出结果:

三种算法的时间复杂度分析:
欧几里得算法所用时间最短,蛮力法所用时间最长(不适用于数据较大的情况)。

posted @   星星盛开的地方  阅读(2174)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示