求问,为什么这段代码不能求最大公约数
#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;
}
为啥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;
}
给你找了一篇非常好的博客,你可以看看是否有帮助,链接:两个整数的最大公约数