最大的最大公约数
第2 - N + 1行:每行1个数,对应输入的正整数.(1 <= S[i] <= 1000000)
4 9 15 25 16
5
思路:把输入的数的位置标为1,其余为0.
一个数如果是他的公约数,那么公约数按倍数增长,总会达到他的位置的1,从而加起来。
同理,如果有sum=2,代表着这个数,是他们的公约数。
代码如下:
#include <iostream> #include <cstdlib> #include <cstring> using namespace std; int cnt[1000001]; int main() { int N; int MAX = 0; int num; while (cin >> N) { MAX = 0; memset(cnt,0,sizeof(cnt)); for (int i = 0; i < N; ++ i) { cin >> num; ++cnt[num]; if (num > MAX) { MAX = num; } } for (int i = MAX; i >= 1; -- i) { int sum = 0; ///如果i是最大公约数,那么i*k,就会等于n、 ///当n数目达到2的时候,就退出,求出了答案。 for (int j = i; j <= MAX; j+= i) { sum += cnt[j]; if (sum >= 2) { break; } } if (sum >= 2) { cout << i << endl; return 0; } } } return 0; }