为什么代码运行出来的最大公因数和最小公倍数有一部分不对

#include<stdio.h>
int main() {
int a,b,c,d,e;
scanf("%d%d",&a,&b);
if(a>b)
c=a%b;
if(b>=a)
c=b%a;
while(c!=0) {
if(a>b) {
d=c;
c=b%d;
} else {

        d=c;
        c=a%c;
    }


}
printf("最大公约数为%d\n",d);
e=a*b/d;
printf("最小公倍数为%d\n",e);
return 0;

}

求最大公约数和最小公倍数:

#include <stdio.h>
int gcd(int a,int b)
{
    if(b==0) return a;
    else return gcd(b,a%b);
}
int main(void)
{
    int x=0,y=0;
    printf("输入两个正整数:");
    scanf("%d%d",&x,&y);
    printf("它们的最大公约数为:%d\n",gcd(x,y));
    printf("它们的最小公倍数为:%d",x*y/gcd(x,y));    
    return 0;
}

long long?