B. Divisors of Two Integers
題目鏈接
題目大意:給出一組由x的所有除數和y的所有除數組成的數組,求x和y的值。
思路:先給數組排序,首先可以知道最大的數就是其中一個解,記爲x,然後用桶來存能被x整除的數的下標,標記爲1。例如第i個能被x整除,即標記b[i]=1,然後如果b[i+1]=b[i]的話,就會把b[i+1]也變爲1,這樣是錯誤的,所以需要再開一個數組來記錄,防止重複標記相同大小的數,使得b記錄的位置上的數都不相同,剩餘未進入桶b的相應位置的數就是另一個數的除數,最大的那個就是結果了。(一開始打算枚舉每個數,但是方法不對,折磨了我好久= =)。
代碼
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[140],b[10005],v[10005];//b桶存的是位置!
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
memset(b,0,sizeof(b));
memset(v,0,sizeof(v));
int m=a[n-1],p=0;
b[n-1]=1;//存最大的數。
v[m]=1;
for(int i=0;i<n-1;i++){
if(m%a[i]==0&&v[a[i]]==0){
b[i]=1;
v[a[i]]=1;//標記。這樣子可以保證數組中,存在數值相同的兩個數,只有一個的位置被存進b。
}
}
int v[140],max=-1;
for(int i=0;i<n-1;i++){
if(b[i]==0){
if(max<a[i]) max=a[i];//找沒被b桶收集的且數值最大的。
}
}
printf("%d %d",m,max);
return 0;
}