B — Divisors of Two Integers
原题链接:https://codeforces.com/group/5yyKg9gx7m/contest/265863/problem/B
题目大意:
给出一个串数字,他们是两个数x和y的因子集合,x和y相同的因子可以重复出现,题目要求的就是满足这串数字的一对x和y。
题目分析:
刚开始愣愣的,不知道怎么做,后来想到因子中就包括了自身,也就是答案就在这串数字里。又想了想,这串数,最大的肯定是一个答案,那只要把这个最大的因子筛选掉,剩下的数中最大的就是另一个答案。
代码实现:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int main()
{
int n;
int num[130];
int x1[130]; //已经确定的数的所以因子
int x, y; //答案
int i, j, k;
cin >> n;
for(i=0; i<n; i++) cin >> num[i];
//直接特判n等于2的情况,都为1
if(n == 2){
cout << num[0] << ' ' << num[1] << endl;
return 0;
}
//排序,最大值为其中一个答案
sort(num,num+n);
x = num[n-1];
//找出x的所有因子
k = 0;
for(i=1; i<x; i++){
if(x%i == 0 && i <= x/i){
x1[k++] = i;
if(i != x/i){ //例如16 = 4 * 4,那么4只记录一次
x1[k++] = x / i;
}
}
}
//筛掉原来数集里x的因子
for(j=0; j<k; j++){
for(i=0; i<n; i++){
if(num[i] == x1[j]){
num[i] = 0;
break; //注意只筛掉一个!
}
}
}
//剩下的最大的数就是另一个答案
for(i=n-1; i>0; i--){
if(num[i] != 0){
y = num[i];
break;
}
}
cout << x << ' ' << y << endl;
return 0;
}
最后希望路过的dl能给予改进的建议!