zoukankan      html  css  js  c++  java
  • 多个数据的最小公倍数

    有一种求最小公倍数算分就是先求出所有项的积M,然后M除以每项的到新数列,求出新数列的最大公约数N,最小公倍数就是M/N;

    #include <stdio.h>
    #include <algorithm>
    int a[100011];
    int b[100011];
    int main()
    {
         int i,j,n,m,k,sum;
         while(scanf("%d",&n)!=EOF)
         {
             sum=1;
              memset(a,0,sizeof(a));
              memset(b,0,sizeof(b));
               for(i=0;i<n;i++)
                {
                     scanf("%d",&a[i]);
                     sum*=a[i];
                }
               for(i=0;i<n;i++)
                {
                    k=a[i];
                     a[i]=sum/k;
                }
             for(i=0;i<n;i++)
              {
                     for(j=1;j*j<=a[i];j++)
                        {
                             if(a[i]%j==0)
                             {
                                if(a[i]==j*j) b[j]++;
                             else{
                                      b[j]++;
                                       b[a[i]/j]++;
                                    }
                             }
                       }
              }
                for(i=100011;i>0;i--)
                  {
                        if(b[i]==n)
                          {
                              m=i;break;
                          }
                    }
                 printf("%d ",sum/m);
     }
    return 0;
    }

    提交显示是运行错误,是数据越界,题目要求的是32位整数,32位就是4个字节,有int 、long型,当输入数据过大时,求出所有数的乘积肯定会越界,所有要换一种算法;

    #include <stdio.h>
    int c(int x,int y)
    {
        int temp,t,a,b;
        if(x<y)
        {
            t=x;
            x=y;
            y=t;
        }
        a=x;b=y;
        temp=x%y;
        while(temp!=0)
        {
    
            x=y;
            y=temp;
            temp = x%y;
        }
        return a*(b/y);//用括号是防止a*b的值越界
    }
    int main()
    {
        int i,n,m,a[100024];
        while(scanf("%d",&n)!=EOF)
        {
            for(i=0;i<n;i++)
            {
                scanf("%d",&a[i]);
            }
            for(i=1;i<n;i++)
            {
                m=c(a[i-1],a[i]);
                a[i]=m;
            }
            printf("%d
    ",m);
        }
        return 0;
    }

    此算法的思想是,先求出第一个和第二个的最小公倍数,在用这个最小公倍数与第三个求出最小公倍数,以此类推;
    当然,为了代码简介点,可以在输入时,就开始求,不必要先把输入数据储存;

    还有一个算法
    #include<stdio.h>
    int main()
    {
        int i,n,s[500],a;
        while(scanf("%d",&n)!=EOF)
    
        {
            a=0;
            for(i=1;i<=n;i++)
            {
                scanf("%d",&s[i]);
                if(a<s[i])  a=s[i];
            }
            for(i=1;i<=n;i++)
            {
              if(a%s[i]!=0)
              {
                  a++;
                  i=0;
              }
            }
            printf("%d
    ",a);
    
        }
        return 0;
    
    }
    就是从最大值开始加,一直到,这个值能整除所有的数,那么就是最小公倍数;


  • 相关阅读:
    在Ubuntu下安装Apache
    linux 安装jdk 配置tomcat
    linux命令——rmdir
    linux命令——rm
    WebApi路由解析增加版本控制
    eclipse Dynamic web module相关问题
    mysql 5.7.18 windows zip安装
    微信扫描二维码登录网站技术原理
    Maven实战(八)——常用Maven插件介绍(下)
    Maven实战(七)——常用Maven插件介绍(上)
  • 原文地址:https://www.cnblogs.com/liuming1115/p/4488229.html
Copyright © 2011-2022 走看看