求n个数的公倍数java,求N个数的最小公倍数 - osc_n6euf5h6的个人空间 - OSCHINA - 中文开源技术交流社区...

题目描述

求n(n <= 50)个数的最小公倍数。

输入

输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。

输出

为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。

样例输入

2 4 6

3 2 5 7

样例输出

12

70

在数学上,我们求几个数的最小公倍数的方法是对他们分解质因数,然后将他们的质因数相乘,如果有相同的质因数则乘的时候乘该共有质因数的最高次幂项,这种方法显然不适合写程序解题,我们考虑另一种方法。公式法,有这样一个公式:x*y = gcd *lcm,即是x y为要求最小公倍数的两个数,lcm代表最小公倍数,gcd代表最大公约数。将公式变形可得lcm = x*y/gcd,我们就可以利用这个公式求lcm。

求gcd的方法很多,可以手写一个函数gcd()利用辗转相除法求,由于这里是解题,我们可以直接使用G++编译器自带的 __gcd(int,int)函数来求,返回值即是这两个数的最大公约数,使用时需要包含头文件#include,这是c++的头文件,另外,这个函数在devc++里可用,code::blocks应该也可用,但是vs里是用不了这个函数的,请自行实现一个。

那么我们理一下写程序的思路,首先我们要用一个数组储存要求的几个数,然后写个函数循环求gcd,这里我曾犯了一个错,我把求lcm和gcd的过程分开了,就是先对这n个数求lcm,然后统一求gcd,这是错误的。正确的做法是,假如传进来n个数a b c d e....,我们应该先对a b求lcm然后求a b的gcd,再用这个结果(a b的gcd)和c一起求gcd,再用结果和d一起求gcd,以此类推。如果担心溢出问题可以将公式调整一下求值顺序,lcm = x/gcd*y,对这题而言多此一举,题目已经说明结果为32位整数。

下面是我的题解代码:

#include

#include

using namespace std;

int main(){

int n,a;

while(scanf("%d",&n) != EOF){

int arr[n];

for(int i=0;i

scanf("%d",&arr[i]);

}

a = arr[0];

if(n == 1){

printf("%d\n",a);

continue;

}

for(int i=1;i

a = a/__gcd(a,arr[i])*arr[i];

}

printf("%d\n",a);

}

return 0;

}

这份代码提交OJ已AC。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值