所以约数(数论,gcd)

Actci上课睡了一觉,下课屁颠屁颠的去找数学老师补课,问了老师一个题目:
    给出两个数a,b,问a和b的全部公约数是什么?
数学老师一看这道题太简单了,不屑回答,于是就交给了你。

输入描述:

一行两个数a,b.

输出描述:

a和b的全部公约数,每个数字之间空格隔开。

示例1

输入

25 37

输出

1

示例2

输入

25 100

输出

1 5 25

备注:

对于100%的数据,1 ≤ a,b ≤ 10^13

先gcd,再遍历,记得要unique,所以的数字全取LL

 unique函数属于STL中比较常用函数,它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情况,下面会讲)。由于它”删除”的是相邻的重复元素,所以在使用unique函数之前,一般都会将目标序列进行排序。

ac:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define MAXN 1000005
ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}

ll ans[MAXN]={0};

int main()
{
    ll a,b,x;
    cin>>a>>b;
    int tot=0;
    x=gcd(a,b);
    for(ll i=1;i*i<=x;i++)
    {
        if(x%i==0)
        {
            ans[tot]=i;
            tot++;
            ans[tot]=x/i;
            tot++;
        }
    }
    sort(ans,ans+tot);
    int y=unique(ans,ans+tot)-ans;
    for(int i=0;i<y;i++)
        printf("%lld ",ans[i]);
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41183791/article/details/85776655