int main(void)
{int a,b,t,yue,bei; //yue:最大公约数,bei:最小公倍数
scanf("%d %d",&a,&b);
if(a<b)
{a=t;
a=b;
b=t;
}
for(yue=b;yue<=2;yue--) //求最大公约数
{if(a%yue==0&&b%yue==0)
{
printf("%d",yue);
break;
}
}
if(yue==1)
printf("%d",yue);
for(bei=a;bei<=a*b;bei++)//求最小公倍数
{if(bei%a==0&&bei%b==0)
{
printf("%d",bei);
break;
}
}
return 0;
} //问题出在了最大公约数上,输出的结果只有最小公倍数。
照你的思路,for
循环里的条件判断用错了,应该是>=
,代码如下
#include<stdio.h>
int main(void)
{
int a, b;
scanf("%d %d", &a, &b);
if (a < b)
{
int temp = a;
a = b;
b = temp;
}
for (int yue = b; yue >= 2; yue--) // 这里是'>=',不是'<='
{
if (a % yue == 0 && b % yue == 0)
{
printf("%d", yue);
break;
}
}
return 0;
}
一般求最大公约数使用的是辗转相除法,效率比枚举法更高,代码如下:
#include<stdio.h>
int main()
{
int a, b, t;
scanf("%d %d", &a, &b);
while (b != 0) {
t = a % b;
a = b;
b = t;
}
printf("最大公约数是%d", a);
return 0;
}
谢谢,非常感谢,刚刚深入理解了下您给出的辗转相除法,非常实用!
第一个if后面a=t就有问题
大神,能具体说说问题出在哪吗?这个求最大公约数的方法是我在百度上查的。
这个用t,我理解的是无论输入的a,b谁大,都得令a大,不然没法操作
@Fate-Joker:
1、t那会并没有初始化,直接赋给a没意义;
2、a=t之后直接再来一个a=b,那就不管t是几,a都等于b了
3、a=b之后,a原来你输入的值就没了,输入a也就没意义了,因为你并没有另外找个临时变量存那个值
你好你好你好
你好呀。