51nod 1179 最大的最大公约数

来源:互联网 发布:清华大学有网络教育吗 编辑:程序博客网 时间:2024/04/29 19:40

1179 最大的最大公约数

题目来源: SGU
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注
给出N个正整数,找出N个数两两之间最大公约数的最大值。例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5。
Input
第1行:一个数N,表示输入正整数的数量。(2 <= N <= 50000)
第2 - N + 1行:每行1个数,对应输入的正整数.(1 <= S[i] <= 1000000)
Output
输出两两之间最大公约数的最大值。
Input示例
4
9
15
25
16
Output示例
5

题解:

两个数的公约数说明两个数都含有这个约数,我们可以利用这个性质。打一个约数表,从最大的约数开始往前枚举,碰到约数个数大于等于2,直接输出即可。
以下是自己的代码:

代码:

#include <bits/stdc++.h>using namespace std;typedef long long LL;const LL maxn = 1000000+10;int cnt[maxn];void solve(LL num){    LL d = sqrt(num);    for(int i=1;i<=d;i++)    if(num%i==0) {cnt[i]++;cnt[num/i]++;}}int main(){    int N;    cin>>N;    LL tmp;    LL M=-(1<<30);    for(int i=0;i<N;i++)    {        cin>>tmp;        solve(tmp);        M=max(M,tmp);    }    for(int i=M;i>=1;i--)    if(cnt[i]>=2) {cout<<i<<endl;break;}    return 0;}

参考大佬的代码:筛法

#include <stdio.h>  #include <string.h>  #define maxn 1000000+10  int num[maxn];  int book[maxn];  int n,m;  int main()  {      while(~scanf("%d",&n))      {          memset(num,0,sizeof(num));          int max1=0,ans,k=1;          for(int i=0; i<n; i++)          {              scanf("%d",&m);              book[m]++;              if(m>max1)                  max1=m;          }          for(int i=max1; i>=1; i--)          {              ans=0;              for(int j=i; j<=max1; j+=i)              {                  ans+=book[j];                  if(ans>=2)                  {                      k=i;                      break;                  }              }              if(ans>=2)                  break;          }          printf("%d\n",k);      }      return 0;  }  
原创粉丝点击