对于求n个数的gcd的想法

来源:互联网 发布:linux c程序编译 编辑:程序博客网 时间:2024/05/24 23:16

一点小小的思路。

其实也没什么, 就是把n个数依次求gcd就行了。 每求过一次两数的gcd, 就把原来的两数删除并把新的gcd加入即可。 时间复杂度O(n)。

证明:

若原来的n个数分别为a1,a2,...,an, 记结果ans = gcd(a1,a2,...an), 那么对于任意ai, 有ans | ai。 从集合的角度来看, 若Ai为ai的因数集合, 那么ANS = A1 ∩ A2 ∩... ∩ An。 现在我们可以得出结论, ANS ∈ Ai ∩ Aj, 故原方法成立。

#include <cstdio>using namespace std;int gcd(int x, int y){    if (!y) return x;    return gcd(y, x%y);}int main(){    int n, x, ans;    scanf("%d", &n);    scanf("%d", &ans);    for (int i = 1; i < n; ++i)    {        scanf("%d", &x);        ans = gcd(ans, x);    }    printf("%d\n", ans);    return 0;}


0 0