公约数和公倍数
-
描述
-
小明被一个问题给难住了,现在需要你帮帮忙。问题是:给出两个正整数,求出它们的最大公约数和最小公倍数。
-
输入
-
第一行输入一个整数n(0<n<=10000),表示有n组测试数据;
随后的n行输入两个整数i,j(0<i,j<=32767)。
输出
- 输出每组测试数据的最大公约数和最小公倍数 样例输入
-
3 6 6 12 11 33 22
样例输出
-
6 6 1 132 11 66
-
第一行输入一个整数n(0<n<=10000),表示有n组测试数据;
#include <stdio.h>
int main ()
{
int n, i, j, a, b, m;
scanf ("%d", &n);
while (n--)
{
scanf ("%d%d", &i, &j);
if (i < j)
{
m = i;
i = j;
j = m;
} //将大小数排列后用于下头的for循环
for (a = j + 1; a--; a < j) //运算时a--为减一,则输出时不包括i本身,故a = j + 1
{
if (i % a == 0 && j % a == 0)
{
printf("%d ", a); break; //设置循环来求公约数
}
}
printf ("%d\n", i * j / a); //当得知公约数的时候,公倍数等于两个原数相乘后除以公约数。
}
return 0;
}
错误一
刚开始在for循环那里写成了a < j || a < i;想判断两个都成立,但忘了这样的输出恒为1或0.
错误二
在求公倍数的时候用的方法不对,但自己一直以为公倍数的求错了,实际上是错误一导致的,自己百度后发现了i * j / a的用法。不然自己还是用一堆方程式表示。
优秀代码。
01.#include<stdio.h>
02.
int
main()
03.
{
04.
unsigned
int
u,v,r,s,i,d;
05.
scanf
(
"%u"
,&s);
06.
for
(i=1;i<=s;i++)
07.
{
08.
scanf
(
"%u%u"
,&u,&v);
09.
d=u*v;
10.
while
(v!=0)
11.
{
12.
r=u%v;
13.
u=v;
14.
v=r;
15.
}
16.
printf
(
"%u %u\n"
,u,d/u);
17.
}
18.
return
0;
19.
}
while看不懂,百度去。