51nod 1179 最大的最大公约数

一直Runtime error  

后来发现数组开小了 调了半天

大概两种写法吧

第一种是枚举每个值 把他的因子都记录  最后从最大的因子 倒着数 这样子

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000000+100;
int s[maxn];
int t[maxn];

int main ()
{
    int n;
    scanf("%d",&n);

    for(int i=1;i<=n;i++)
        scanf("%d",&s[i]);//mx=max(mx,s[i]);
    //t[1] = 2;//如果没有的话就是1了
    int mx = 1;
    for(int i=1;i<=n;i++)
    {
        int r = sqrt(s[i]);

        for(int j=1;j<=(r+1);j++)
        {
            if(s[i]%j==0)
            {
                t[j]++;
                t[s[i]/j]++;
                mx =max(mx,max(j,s[i]/j));
                //while(s[i]%j==0)
                //{
                  //  s[i]/=j;
               // }
                //printf("%d ",j);
            }
        }
        //puts("");
    }
    for(;mx>=1;mx--)
        if(t[mx]>=2)
        {
            printf("%d\n",mx);
            return 0;
        }

}

 

 

第二种 类似素数筛 的 一种筛法  不过是倒着来的

 

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000000+100;
//int s[maxn];
int t[maxn];

int main ()
{
    int n;
    scanf("%d",&n);
    int mx =0;//记录最大的
    for(int i=1;i<=n;i++)
    {
        int s;
        scanf("%d",&s);
        mx = max(s,mx);
        t[s]++;
    }
    int i=mx;

    //cout<<mx<<endl;
    for( ;i>=1;i--)//用到了筛法类似的东西
    {
        int sum=0;
        for(int j=i;j<=mx;j+=i)
        {
            sum += t[j];
            if(sum>=2)
                break;
        }
        if(sum>=2)
            break;
    }
    //for(int i=1;i<=25;i++)
        //printf("%d ",t[i]);
    printf("%d\n",i);
}

 

posted @ 2017-08-21 10:37  Draymonder  阅读(161)  评论(0编辑  收藏  举报