杭电 2028 ( Lowest Common Multiple Plus )

  链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2028

  题目要求:就是求最大公倍数,我百度了一下,最好实现的算法就是:

公式法

由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即(a,b)×[a,b]=a×b。所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数。
  例如,求[18,20],即得[18,20]=18×20÷(18,20)=18×20÷2=180。求几个自然数的最小公倍数,可以先求出其中两个数的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数,依次求下去,直到最后一个为止。最后所得的那个最小公倍数,就是所求的几个数的最小公倍数。    

  总结下就是:两数乘积=两数最大公约数*两数最小公倍数。 只不过这次用到的是 两数最小公倍数=两数乘积/两数最大公约数。每两个数个一组依次向后求就可以了。

  然后在ac之前犯了个毛病,就是数据类型我全部是int,然后题目要求中有一句:你可以假设最后的输出是一个32位的整数。然后就有个问题:相乘过界。就是过界问题,可能两数相乘会超过 int 的最大界限,所以最好是先除。或者把类型变掉,我选择后者。

#include <iostream>
#include<math.h>
#include <iomanip>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<stdlib.h>
#include<iterator>
using namespace std;

int gcd(int a,int b)
{
    int big=a;
    int smal=b;
    int ck;
    if(big<smal)
    {
        ck=a;
        a=b;
        b=a;
    }
    int temp;
    while(smal>0)
    {
        temp=big%smal;
        big=smal;
        smal=temp;
    }
    return big;
}

unsigned int gys(unsigned int a,unsigned int b)
{
    unsigned int kk;
    unsigned int ak=a;
    unsigned int bk=b;
    kk=ak*bk/gcd(ak,bk);
    return kk;
}

int main()
{

    int n;
    while(cin>>n)
    {
    unsigned int *p;
    p=new unsigned int[n];

    for(int i=0;i<n;i++)
    {
        cin>>p[i];
    }

    int unsigned max_gys=p[0];

    for(int j=0;j<n-1;j++)
    {
        max_gys=gys(max_gys,p[j+1]);
    }
    cout<<max_gys<<endl;

    delete []p;
    }

    return 0;
}

  

时间: 2024-10-09 14:06:50

杭电 2028 ( Lowest Common Multiple Plus )的相关文章

杭电 HDU ACM 2028 Lowest Common Multiple Plus

Lowest Common Multiple Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 39183    Accepted Submission(s): 16144 Problem Description 求n个数的最小公倍数. Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数. Ou

hdu 2028 Lowest Common Multiple Plus(最小公倍数)

Lowest Common Multiple Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 34980    Accepted Submission(s): 14272 Problem Description 求n个数的最小公倍数. Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数. Out

HDOJ 2028 Lowest Common Multiple Plus

Lowest Common Multiple Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 33702    Accepted Submission(s): 13766 Problem Description 求n个数的最小公倍数. Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数. Ou

#2028 Lowest Common Multiple Plus

http://acm.hdu.edu.cn/showproblem.php?pid=2028 应该是比较简单的一道题啊...求输入的数的最小公倍数. 先用百度来的(老师教的已经不知道跑哪去了)辗转相除法求出两数的最大公因数,再将两数相乘并除以最大公因数即得到最小公倍数. 一开始我写的代码如下 1 #include<stdio.h> 2 3 int gcd(int a, int b) 4 { 5 if (b == 0) 6 { 7 return a; 8 } 9 return gcd(b, a%

hdu 2028 Lowest Common Multiple Plus

Problem Description 求n个数的最小公倍数. Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数. Output 为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行.你可以假设最后的输出是一个32位的整数. Sample Input 2 4 6 3 2 5 7 Sample Output 12 70 思路:水题.题目要求32位整数,所以使用unsigned int. 代码: #include <iostream> #include 

杭电1019 Least Common Multiple【求最小公倍数】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1019 解题思路:lcm(a,b)=a*b/gcd(a,b) 反思:最开始提交的时候WA,以为是溢出了,于是改成了long long,还是WA,于是就不明白了,于是就去看了discuss,发现应该这样来写 lcm(a,b)=a*gcd(a,b)*b;是为了以防a乘以b太大溢出,注意啊!!!!所以就先除再乘. #include<stdio.h> int gcd(int a,int b) { int t

Lowest Common Multiple Plus(杭电2028)

/*Lowest Common Multiple Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 33241    Accepted Submission(s): 13578 Problem Description 求n个数的最小公倍数. Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数.

HDU2028 Lowest Common Multiple Plus【stein算法】【水题】

Lowest Common Multiple Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 36800    Accepted Submission(s): 15116 Problem Description 求n个数的最小公倍数. Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数. Ou

杭电1159(Common Subsequence)LCS和dp

点击打开杭电1159 Problem Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = <x1, x2, ..., xm> another sequence Z = <z1, z2, ..., zk> is a subsequence of X if there ex