- 6是最小的,1到3所有数的倍数。(6 = 1 * 6 = 2 * 3 = 3 * 2)
2520是最小的,1到10的所有数字的倍数。
输入n,输出最小的正整数,他是1到n所有数的倍数
Input
输入第一行组数T, 接下来T行,每行一个整数n。 (1 <= T <= 20) (1 <= N <= 20)
Output
对于每组数据,输出一个数,表示1到n的最小公倍数。
Sample Input
3
3
10
20
Sample Output
6
2520
232792560
分析:
- 可以直接把1到n的最小公倍数求出来放入数组中,直接根据输入的n在数组中查找去用即可,实现了只计算一遍但是可以多次查找。不用每次都计算,而且存入数组后,可以根据上一个求得最小公倍数来当前要求的最小公倍数。
- 要求最小公倍数,需要先求最大公因数。用辗转相除法。
- 需要注意的是当n为20时,计算时会有溢出,但是不难发现,n为19和n为20的最小公倍数都是n为19时的最小公倍数。所以直接输出n为19的最小公倍数就可以了。
以下是通过的C语言代码:
#include <stdio.h>
int main()
{
int i,r,x,y,n;
int a[25],b[21];
a[1]=1;
for(i=2;i<=20;i++)
{
x=a[i-1]; //上一个
y=i;
while(y>0) //求最大公因数 辗转相除法
{
r=x%y;
x=y;
y=r;
}
a[i]=a[i-1]*i/x;
//printf("a[%d]: %d\n",i,a[i]);
}
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&b[i]);
}
for(i=1;i<=n;i++)
{
if(b[i]==20)
printf("%d\n",a[19]);
else
printf("%d\n",a[b[i]]);
}
return 0;
}