Go: package main

import "fmt"

func gcd(x, y int64) int64 {
	for y != 0 {
		r := x % y
		x = y
		y = r
	}
	return x
}

func lcm(x, y int64) int64 {
	return x / gcd(x, y) * y
}

func main() {
	for {
		var a, b int64

		fmt.Scanf("%d %d", &a, &b)

		if a == 0 && b == 0 {
			break
		}

		fmt.Printf("%d %d\n", gcd(a, b), lcm(a, b))
	}
}

C++: //注意long long可能要修改
//如果位数不?修改MAXSIZE MAXN和DLEN不要? 
#include<bits/stdc++.h>
using namespace std;
#define MAXN 9999
#define MAXSIZE 1010
#define DLEN 4
class BigNum {
	public:
		int a[MAXSIZE];  //可以控制大数的位数
		int len;
	public:
		BigNum() {
			len=1;    //?造函数
			memset(a,0,sizeof(a));
		}
		BigNum(const int);     //将一个int?型的?量?化成大数
		BigNum(const long long);  //将一个long long?型的?量?化成大数
		BigNum(const char*);   //将一个字符串?型的?量?化?大数
		BigNum(const BigNum &); //拷??造函数
		BigNum &operator=(const BigNum &); //重????算符，大数之??行???算
		friend istream& operator>>(istream&,BigNum&); //重??入?算符
		friend ostream& operator<<(ostream&,BigNum&); //重??出?算符

		BigNum operator+(const BigNum &)const;  //重?加法?算符，?个大数之?的相加?算
		BigNum operator-(const BigNum &)const;  //重??法?算符，?个大数之?的相??算
		BigNum operator*(const BigNum &)const;  //重?乘法?算符，?个大数之?的相乘?算
		BigNum operator/(const BigNum &)const;  //重?乘法?算符，?个大数之?的相除?算
		BigNum operator/(const int &)const;     //重?除法?算符，大数?一个整数?行相除?算
		BigNum operator/(const long long &)const;     //重?除法?算符，大数?一个64位整数?行相除?算
		BigNum operator^(const int &)const;     //大数的n次方?算
		int operator%(const int &)const;        //大数?一个int?型的?量?行取模?算

		long long operator%(const long long &)const;    //大数?一个long long?型的?量?行取模?算
		bool operator>(const BigNum &T)const;   //大数和?一个大数的大小比?
		bool operator>(const int &t)const;      //大数和一个int?型的?量的大小比?

		bool operator>(const long long &t)const;   //大数和一个long long?型的?量的大小比?
		void print();        //?出大数
		void clean() {
			while(len > 1 && !a[len-1]) len--;
		}
};
BigNum::BigNum(const int b) { //将一个int?型的?量?化?大数
	int c,d=b;
	len=0;
	memset(a,0,sizeof(a));
	while(d>MAXN) { //?位存四位数字，MAXN=9999；
		c=d-(d/(MAXN+1))*(MAXN+1);
		d=d/(MAXN+1);
		a[len++]=c;
	}
	a[len++]=d;
}
BigNum::BigNum(const long long b) { //将一个int?型的?量?化?大数
	long long c,d=b;
	len=0;
	memset(a,0,sizeof(a));
	while(d>MAXN) { //?位存四位数字，MAXN=9999；
		c=d-(d/(MAXN+1))*(MAXN+1);
		d=d/(MAXN+1);
		a[len++]=c;
	}
	a[len++]=d;
}
BigNum::BigNum(const char *s) { //将一个字符串?型的?量?化?大数
	int t,k,index,L,i;
	memset(a,0,sizeof(a));
	L=strlen(s);
	len=L/DLEN;
	if(L%DLEN)len++;
	index=0;
	for(i=L-1; i>=0; i-=DLEN) {
		t=0;
		k=i-DLEN+1;
		if(k<0)k=0;
		for(int j=k; j<=i; j++)
			t=t*10+s[j]-'0';
		a[index++]=t;
	}
}
BigNum::BigNum(const BigNum &T):len(T.len) { //拷??造函数
	int i;
	memset(a,0,sizeof(a));
	for(i=0; i<len; i++)
		a[i]=T.a[i];
}
BigNum & BigNum::operator=(const BigNum &n) { //重????算符，大数之????算
	int i;
	len=n.len;
	memset(a,0,sizeof(a));
	for(i=0; i<len; i++)
		a[i]=n.a[i];
	return *this;
}
istream& operator>>(istream &in,BigNum &b) {
	char ch[MAXSIZE*4];
	int i=-1;
	in>>ch;
	int L=strlen(ch);
	int count=0,sum=0;
	for(i=L-1; i>=0;) {
		sum=0;
		int t=1;
		for(int j=0; j<4&&i>=0; j++,i--,t*=10) {
			sum+=(ch[i]-'0')*t;
		}
		b.a[count]=sum;
		count++;
	}
	b.len=count++;
	return in;
}
ostream& operator<<(ostream& out,BigNum& b) { //重??出?算符
	int i;
	cout<<b.a[b.len-1];
	for(i=b.len-2; i>=0; i--) {
		printf("%04d",b.a[i]);
	}
	return out;
}
BigNum BigNum::operator+(const BigNum &T)const { //?个大数之?的相加?算
	BigNum t(*this);
	int i,big;
	big=T.len>len?T.len:len;
	for(i=0; i<big; i++) {
		t.a[i]+=T.a[i];
		if(t.a[i]>MAXN) {
			t.a[i+1]++;
			t.a[i]-=MAXN+1;
		}
	}
	if(t.a[big]!=0)
		t.len=big+1;
	else t.len=big;
	return t;
}
BigNum BigNum::operator-(const BigNum &T)const { //?个大数之?的相??算
	int i,j,big;
	bool flag;
	BigNum t1,t2;
	if(*this>T) {
		t1=*this;
		t2=T;
		flag=0;
	} else {
		t1=T;
		t2=*this;
		flag=1;
	}
	big=t1.len;
	for(i=0; i<big; i++) {
		if(t1.a[i]<t2.a[i]) {
			j=i+1;
			while(t1.a[j]==0)
				j++;
			t1.a[j--]--;
			while(j>i)
				t1.a[j--]+=MAXN;
			t1.a[i]+=MAXN+1-t2.a[i];
		} else t1.a[i]-=t2.a[i];
	}
	t1.len=big;
	while(t1.a[len-1]==0 && t1.len>1) {
		t1.len--;
		big--;
	}
	if(flag)
		t1.a[big-1]=0-t1.a[big-1];
	return t1;
}
BigNum BigNum::operator*(const BigNum &T)const { //?个大数之?的相乘
	BigNum ret;
	int i,j,up;
	int temp,temp1;
	for(i=0; i<len; i++) {
		up=0;
		for(j=0; j<T.len; j++) {
			temp=a[i]*T.a[j]+ret.a[i+j]+up;
			if(temp>MAXN) {
				temp1=temp-temp/(MAXN+1)*(MAXN+1);
				up=temp/(MAXN+1);
				ret.a[i+j]=temp1;
			} else {
				up=0;
				ret.a[i+j]=temp;
			}
		}
		if(up!=0)
			ret.a[i+j]=up;
	}
	ret.len=i+j;
	while(ret.a[ret.len-1]==0 && ret.len>1)ret.len--;
	return ret;
}
BigNum BigNum::operator/(const BigNum & b)const {//大数之?的相除
	int i, j;
	BigNum c ,d = 0;
	for (i = len - 1; i >= 0; i--) {
		d = d*10 + a[i];
		for (j = 0; j < 10; j++) if (b*(j+1)>b) break;
		c.a[i] = j;
		d = d - b*j;
	}
	c.clean();//去0
	return c;
}
BigNum BigNum::operator/(const int &b)const { //大数?一个整数?行相除?算
	BigNum ret;
	int i,down=0;
	for(i=len-1; i>=0; i--) {
		ret.a[i]=(a[i]+down*(MAXN+1))/b;
		down=a[i]+down*(MAXN+1)-ret.a[i]*b;
	}
	ret.len=len;
	while(ret.a[ret.len-1]==0 && ret.len>1)
		ret.len--;
	return ret;
}
BigNum BigNum::operator/(const long long &b)const { //大数?一个整数?行相除?算
	BigNum ret;
	long long i,down=0;
	for(i=len-1; i>=0; i--) {
		ret.a[i]=(a[i]+down*(MAXN+1))/b;
		down=a[i]+down*(MAXN+1)-ret.a[i]*b;
	}
	ret.len=len;
	while(ret.a[ret.len-1]==0 && ret.len>1)
		ret.len--;
	return ret;
}
int BigNum::operator%(const int &b)const { //大数?一个 int?型的?量?行取模
	int i,d=0;
	for(i=len-1; i>=0; i--)
		d=((d*(MAXN+1))%b+a[i])%b;
	return d;
}
long long BigNum::operator%(const long long &b)const { //大数?一个 64位整数?型的?量?行取模
	long long i,d=0;
	for(i=len-1; i>=0; i--)
		d=((d*(MAXN+1))%b+a[i])%b;
	return d;
}
BigNum BigNum::operator^(const int &n)const { //大数的n次方?算
	BigNum t,ret(1);
	int i;
	if(n<0)exit(-1);
	if(n==0)return 1;
	if(n==1)return *this;
	int m=n;
	while(m>1) {
		t=*this;
		for(i=1; (i<<1)<=m; i<<=1)
			t=t*t;
		m-=i;
		ret=ret*t;
		if(m==1)ret=ret*(*this);
	}
	return ret;
}
bool BigNum::operator>(const BigNum &T)const {  //大数和?一个大数的大小比?
	int ln;
	if(len>T.len)return true;
	else if(len==T.len) {
		ln=len-1;
		while(a[ln]==T.a[ln]&&ln>=0)
			ln--;
		if(ln>=0 && a[ln]>T.a[ln])
			return true;
		else
			return false;
	} else
		return false;
}
bool BigNum::operator>(const int &t)const { //大数和一个int?型的?量的大小比?
	BigNum b(t);
	return *this>b;
}
void BigNum::print() { //?出大数
	int i;
	printf("%d",a[len-1]);
	for(i=len-2; i>=0; i--)
		printf("%04d",a[i]);
	printf("\n");
}
int main() {
	long long a,b;
	while(cin>>a>>b){
		BigNum tmpa(a),tmpb(b);
		long long ans=__gcd(a,b);
		BigNum tmp=tmpa*tmpb/ans;
		cout<<ans<<' '<<tmp<<endl;
	}
}

C++: #include<iostream>
#include<algorithm>
using namespace std;

int main(){
	long long  a,b,ta,tb;
	
	while(cin>>a>>b){
	ta=a;tb=b;
	if(a<b)swap(a,b);
	while(true){
		if(a==0||b==0)break;
		int tmp=a;
		a=b;
		b=tmp%a;
		if(a<b){
		b=1;
		break;
		}
		if(a%b==0)break;
	}
	if(a==0)a=1;
	if(b==0)b=1;
	cout<<b<<" "<<ta*tb/b<<endl;
	}
	return 0;
}

C++: #include"bits/stdc++.h"
using namespace std;

#define ll long long
#define INF INT_MAX/3
#define pi 2*acos(0.0)
#define eps 1e-14

const int MAX_N = 1e+3;
const int MAX_M = 1e+2;
ll a, b;
void input()
{
	scanf("%lld%lld", &a, &b);
}

ll euclid(ll x, ll y) {
	if (y == 0) return x;
	return euclid(y, x%y);
}
int main() {
	while (cin >> a >> b) {
		ll gcd = euclid(a, b);
		ll lcm = a*b / gcd;
		cout << gcd << " " << lcm << endl;
	}
	return 0;
}

C++: #include <iostream>

using namespace std;
using LL = long long;

LL gcd(LL a, LL b) {
    return b == 0 ? a : gcd(b, a % b);
}

LL lcm(LL a, LL b) {
    return a / gcd(a, b) * b;
}

int main() {
    int a, b;
    while (cin >> a >> b) {
        cout << gcd(a, b) << ' ' << lcm(a, b) << endl;
    }
}