求最大公约数和最小公倍数的有效算法有下面3种:
最大公约数:
辗转相除法
有两整数a和b:
① a%b得余数c
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行①相减法
有两整数a和b:
① 若a>b,则a=a-b
② 若a
最小公倍数
- 最小公倍数=两整数的乘积÷最大公约数
HDOJ1019
我们对HDOJ1019进行分析,该题要求m个数的最小公倍数。该题的一个关键是如下规则:
- 假定a和b的最小公倍数为LCM(ab),
- 假定LCM(ab)与c的最小公倍数为LCM(abc)
- 那么LCM(abc)就是a、b、c的最小公倍数。
我们利用该规则可地递推出m个数最终结果
Java代码:
public class problem1019 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int casenum;
Scanner scan=new Scanner(System.in);
casenum=scan.nextInt();
while(casenum>0){
int n=0;
int LCM=0;
n=scan.nextInt();
int number;
LCM=scan.nextInt();
for(int i=0;i<n-1;i++){
number=scan.nextInt();
int temp=gcd(LCM,number);
//这个地方要注意,如果是先乘再除会
//是wrong answer,因为可能会溢出
LCM=LCM/temp*number;
}
System.out.println(LCM);
casenum--;
}
}
static int gcd(int a,int b){
while(a!=b){
if(a>b) a-=b;
else b-=a;
}
return a;
}
}