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); }