LETTers比赛第三场 --1001 Least Common Multiple 解题报告
提交人:侯建鹏
提交日期:2012/4/16
1001 Least Common Multiple
这道题求解的是几个数的最小公倍数,我的想法是先求前两个数的最小公倍数,再求的得到的这个数和第三个数的最小公倍数,以此类推。
求解两个数a和b的最小公倍数d的方法:
1、 用辗转相除法求出这两个数的最大公约数,记为c。
2、 则最小公倍数d=(a/c)*b。
特别注意的问题:为什么d=(a/c)*b而不是d=(a*b)/c?
因为a和b都是32bit的数字,如果先执行a*b很可能会超出32bit的存储范围而发生错误,所以先除再乘。(当然,如果你用的是__int64,可以忽略这个问题)
#include<stdio.h> int number[1010]; int MD(int a , int b ) { int r=a%b; while(r) { a=b; b=r; r=a%b; } return b; } int main() { //freopen("input.txt","r",stdin); int cas,num,md,i; scanf("%d",&cas); while(cas--) { scanf("%d",&num); for(i=0;i<num;i++) { scanf("%d",&number[i]); if(i!=0) { md=MD(number[i-1],number[i]); number[i]=number[i-1]/md*number[i]; } } printf("%d\n",number[num-1]); } return 0; }