关于最小公约数的一个小问题,

来源:百度知道 编辑:UC知道 时间:2024/05/27 06:58:20
#include<stdio.h>
main()
{ int m,n,i,min;
scanf("%d%d",&m,&n);
min=(m<n?m:n);
for(i=2;i<=min;i++)
if(m%i==0&&n%i==0)
{ printf("%d",i);
break;}
if(i>=min+1)//这个if里面为什么是>=号,我试了试,如果去掉>或=都不行,希望大家能指教指教
printf("have no answer!");
system("pause");
}

去掉>,原句就变成if(i=min+1),条件语句是一个赋值语句,只有当min=-1时if语句才不执行,
而去掉=,if语句永远不能执行,因为i最大就等于min+1,应该改成if(i>min)

要弄明白每个变量的含义:

m, n表示待求的两个数,min记录m和n中较小的那个数,然后让循环变量i从2开始到min结束进行循环,一旦i能同时整除m和n则输出i然后退出循环(此时的i即为m和n的最小公约数)

循环结束后判断i是不是达到了min+1,如果没达到说明上面的循环是非正常结束的(即遇到break结束),换句话也就是说已经找到并输出了m和n的最小公约数,当然就不用提示没有解了;但是如果i达到了min+1,则说明上面那个循环正常结束了(正常结束前会再次执行i++使i=min+1,然后判断i<=min为假退出循环),也就是说没有进入break那部分,当然也就没有找到并输出最小公约数了,故给出提示无解。

这里要变可以变成
if(i==min+1)
或者
if(i>min)
只要符合上面说的判断出了上面那个循环是否为非正常结束即可

if(i>=min+1)这个条件句的作用是在m和n没有最小公约数的时候,输出一个无答案的语句。因为如果m和n有最小公约数,那么这个最小公约数最大只能是两个数中的比较小的那个即min,当无论是多少总会通过break跳出for循环,i的最大值也不过是min,因此对于if(i>=min+1)这个无答案的输出句自然不会执行。
而如果没有最小公约数,即当i=min是还没执行break,则继续i++,这时i=min+1,从而for循环结束,这个时候两个数是肯定没有最小公约数了,这时if(i>=min+1)这个就一定会执行,从而保证了整个判断过程的正确性。

for(i=2;i<=min;i++)
if(m%i==0&&n%i==0)
{
printf("%d",i);
break;
}
上面的for循环如果不满足(m%i==0&&n%i=