最大公约数=公约数g1*公约数g2(对所有公约数成立),模仿检验一个数是否为素数,if(gcd%i==0),i=g1,gcd/i=g2, (当i^2!=gcd时,g1!=g2,所以两个是不同的公约数),i^2==gcd时,g1==g2,只要保存一个。
#include<iostream> #include<vector> #include<queue> #include<cstring> #include<algorithm> #include<cmath> #include<cstdio> #include<map> #define INF 0x7f7f7f7f #define MAX_INT 0x7fffffff #define _for(i,a,b) for(int i=(a);i<(b);i++) #define __for(i,a,b) for(int i=(a);i<=(b);i++) using namespace std; typedef long long LL; typedef unsigned int uint; typedef pair<int,int> pa; LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b); } LL num[5000000],nn; int main(){ LL a,b,c,d=1; scanf("%lld%lld",&a,&b); c=gcd(a,b); register int i; for(i=1;d<=c;d+=i+i+1,i++){//d=i*i if(c%i==0){ num[nn++]=i; if(d!=c)num[nn++]=c/i; } } sort(num,num+nn); for(i=0;i<nn;i++) printf("%lld ",num[i]); return 0; }