求最大公约数出错!!

求问,为什么这段代码不能求最大公约数
#include<stdio.h>

int main()
{int m,n,max,i,j;
printf("请输入两个整数n,m:");
scanf("%d,%d",&m,&n);
for(i=1;i<m;i++)
for(j=1;j<m;j++)
{if(m/i==n/i)
max=m/i;
printf("最大公约数为%d,max");
}
return 0;
}

第二个for循环里面判断最大公约数那里错了,条件改为m对i求余与n对j求余相等(保证为i和j分别为m和n的约数),以及i==j即可(保证为公约数),然后ma赋值为i或j都可(即保存当前约数),等循环结束,max里面即存储了最大的公约数。
修改如下:



#include<stdio.h>

int main()
{
    int m,n,max,i,j;
    printf("请输入两个整数n,m:");
    scanf("%d,%d",&n,&m);
    
    for(i=1;i<m;i++){
        for(j=1;j<n;j++)
        {
            if(m%i==n%j&&(i==j)){
                //printf("m=%d,n=%d,i=%d,j=%d\n",m,n,i,j);
                max=i;
            }
                
            
        }
    }
        
    printf("最大公约数为%d",max);    
    return 0;
}

img

为啥i和j都for循环到<m呢?
if和max计算都只用到i,那你用j的for循环的意义是什么呢?
按照你这个代码思路,应该先比较m和n中的较小值,比如较小值为k,然后for循环从k-1开始,一直到1,判断某个循环数是否同时能整除m和n才行
整除是要m%i==0 && n%i==0 ,不是m%i==n%i,这只表示余数相同,不代表余数是0 啊
你这个printf语句放置的位置,也是非常有问题,应该放到if条件成立的地方啊。放在if外面,岂不是一直在输出。另外找到第一个可以整除m和n的整数后,就可以结束判断了啊,还比下去干啥呢
当然,求最大公约数还有更简单的方法

#include <stdio.h>
int main()
{
    int m,n,k,i;
    scanf("%d%d",&m,&n);
    k=m;
    if(m>n)
        k = n;
    for(i=k-1;i>=1;i--)
    {
        if(m%i == 0 && n%i==0)
        {
            printf("%d",i);
            break;
        }
    }
    return 0;
}

给你找了一篇非常好的博客,你可以看看是否有帮助,链接:两个整数的最大公约数