输入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;
}
方法较为巧妙,但我不是太理解原理,附上百科: