输入2个正整数A,B,求A与B的最大公约数。
收起
输入
2个数A,B,中间用空格隔开。(1<= A,B <= 10^9)
输出
输出A与B的最大公约数。
输入样例
30 105
输出样例
15
方法一(穷举):
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
long long b;
scanf("%d%lld",&a,&b);
int c=a<b?a:b;
while(1){
if(a%c==0&&b%c==0)
break;
c--;
}
printf("%d",c);
return 0;
}
此方法正确,但是只能通过一半数据,另外一半超时。
方法二(欧几里得算法):
#include <stdio.h>
#include <stdlib.h>
void mSmall(long long d,long long x){
long long t;
while(d%x!=0){
t=d%x;
d=x;
x=t;
}
printf("%lld",x);
}
int main(){
long long a,b;
scanf("%lld%lld",&a,&b);
if(a>b)
mSmall(a,b);
else
mSmall(b,a);
return 0;
}
方法较为巧妙,但我不是太理解原理,附上百科:

本文介绍了解决两个正整数A与B最大公约数问题的两种算法:穷举法和欧几里得算法。穷举法通过从较小数递减至1逐个检查是否同时整除两数,但效率较低;而欧几里得算法利用辗转相除原理,能高效地找到最大公约数。
1123

被折叠的 条评论
为什么被折叠?



