为啥这个程序运行后,就弹出窗口“程序已停止运行”

为什么这个程序运行后,就弹出窗口“程序已停止运行”
****************************************************************
我想用这个程序求任意两个数的最大公约数,和最小公倍数,求大神指教,勿喷
********************************************************************

#include <stdio.h>
int main()
{
int m,n,t,r,p;
printf("请输入任意两个整数: ");
scanf("m=%d,n=%d\n",&m,&n);
if(m<n)
{ t=m;m=n;n=t;  }
p=m*n;
while(n!=0)
{r=m%n;
 m=n;
 n=r;
}
printf("最大公约数为:%d\n",n);
printf("最小公倍数为:%d\n",p/n);


  return 0;
}
------解决方案--------------------
while(n!=0)//当n == 0 时才跳出循环,这时n已经为零了
{r=m%n;
 m=n;
 n=r;
}
printf("最大公约数为:%d\n",n);
printf("最小公倍数为:%d\n",p/n);//零是不能当作分母的
------解决方案--------------------
引用:
****************************************************************
我想用这个程序求任意两个数的最大公约数,和最小公倍数,求大神指教,勿喷
********************************************************************

#include <stdio.h>
int main()
{
int m,n,t,r,p;
printf("请输入任意两个整数: ");
scanf("m=%d,n=%d\n",&m,&n); 
if(m<n)
{ t=m;m=n;n=t;  }
p=m*n;
while(n!=0)
{r=m%n;
 m=n;
 n=r;
}
printf("最大公约数为:%d\n",n);
printf("最小公倍数为:%d\n",p/n);


  return 0;
}

首先,这个scanf("m=%d,n=%d\n",&m,&n); 不是一种恰当的写法,恰当的写法当中最简单的是scanf("%d%d", &m, &n);
然后,你那个while循环的运算,最终导致n = 0,然后最后的那句printf("最小公倍数为:%d\n",p/n);就会成为除数为零的情况。
下面的代码测试可知:
#include <stdio.h>
int main()
{
int m,n,t,r,p;
printf("请输入任意两个整数: ");
scanf("%d%d",&m,&n);
printf("m = %d, n = %d\n", m, n);
if(m<n)
{ t=m;m=n;n=t;  }
p=m*n;
printf("m = %d, n = %d\n", m, n);
while(n!=0)
{r=m%n;
 m=n;
 n=r;
 printf("w: m = %d, n = %d, r = %d\n", m, n, r);
}
printf("最大公约数为:%d\n",n);
printf("最小公倍数为:%d\n",p/n);


  return 0;
}

测试结果:
请输入任意两个整数: 3 5
m = 3, n = 5
m = 5, n = 3
w: m = 3, n = 2, r = 2
w: m = 2, n = 1, r = 1
w: m = 1, n = 0, r = 0
最大公约数为:0

修改了一下,包括写代码的格式都改了:
#include <stdio.h>

int main(void)
{
    int m, n, t, r, p, q;  //这里多加个q表示最小公倍数

    printf("请输入任意两个整数: ");
    scanf("%d%d",&m,&n);  //scanf修正
    if(m<n)
    {
        t=m;
        m=n;
        n=t;
    }
    if(m % n == 0)  //当其中较大的数是另一个数的倍数时
    {
        p = m;
        q = n;
    }
    else
    {
        p = m*n;
        while(n != 0)   //辗转相除法
        {
            r = m%n;
            if(r == 0)
                break;    //当余数为0时,跳出循环
            m=n;
            n=r;
        }
        q = n;   //记录最大公约数
    }
    printf("最大公约数为:%d\n",q);
    printf("最小公倍数为:%d\n",p);

    return 0;
}