鱼C论坛

 找回密码
 立即注册
查看: 2430|回复: 3

最大公约数的问题

[复制链接]
发表于 2012-4-21 16:08:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 信仰、反悔 于 2012-4-23 08:47 编辑

代码是这样的,编译是没错啦,可是运行就出错了,实在找不出哪里有问题了啦 啦啦啦啦 -各位显现神通吧----------

/*
  题目:已知 两个数的 最小公倍数 240 ,最大公约数 24 ,这两个数可能是多少?
*/
#include<stdio.h>
#include<stdlib.h>

int main (void)
{
    int m,n; // 要求的两个数
    int i;  // 余数,求最大公约数 要 用到
    int m_,n_; // 副本
   
    for(m = 24; m<=240; m++)
    {for(n =24; n<=240; n++) //把 m 和 n 限定在 24 和 240 之间。
     {
           //把 m、n 限定在 公倍数和公约数 之中
           if(m > n && 240%m==0 && 240%n==0 && m%24==0 && n%24==0)
           {
                i = m % n ;         // 能整除 最大公约数就是 n
                if (i == 0 && n==24 && m*n/n == 240) // 判断 两个数 符合要求不
                printf("%d,%d\n",m,n);
                else               // 不能整除 就要计算了
                {
                     m_ = m , n_ = n; // m、n要参与运算,所以做个拷贝   
                     do
                     {m = n;
                      n = i;
                      i = m % n;}   
                     while(i != 0);   // i 如果不为零,就一直求余 求到零
                     if (n==24 && m_*n_/n==240)
                     printf("%d,%d\n",m_,n_);
                }
           }
     }
    }
    system("pause");
    return 0;
}  

第一个错误就是 i=0时,当作除数参与了 % 运算。
第二个错误修改i=0后,会出现无限循环,是由于mn参与了局部循环而影响了开始的for循环,改为mn的副本参与。
但是根据二楼的指导 , 通过 最大公约数和最小公倍数 能简单的求出结果。也就是说我的算法走了弯路,尽管弯路也是路~
总结:数学知识浅薄,对数学关系认识不够;
          多变量时,应用有些混乱,顾此失彼。
修改后如下:
/*
  题目:已知 两个数的 最小公倍数 240 ,最大公约数 24 ,这两个数可能是多少?
*/
#include<stdio.h>
#include<stdlib.h>

int main (void)
{
    int m,n; // 要求的两个数
      
    for(m = 24; m<=240; m++)
    {for(n =24; n < m; n++) //把 m 和 n 限定在 24 和 240 之间,并且n<m
     {

            if( 240%m==0 && 240%n==0 && m%24==0 && n%24==0)
         {
             if(m*n==24*240)
             printf("%d,%d\n",m,n);
          }   
      }
     }
    system("pause");
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-22 18:12:59 | 显示全部楼层
/*题目:已知 两个数的 最小公倍数 240 ,最大公约数 24 ,这两个数可能是多少?*/

#include<stdio.h>

void main()
{
      int x, y;
          for(y=24;y<=240;y++)
          {
                  for(x=24;x<=240;x++)
                  {
                          if(240/24==(x/24)*(y/24)&&(x%24==0)&&(y%24==0))
                          {
                                  printf("%d %d\n", x,y);
                          }
                  }
}
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-22 18:16:03 | 显示全部楼层
注意最大公约数和最小公倍数的关系:
最大公约数是最小公倍数的约数
且:最小公倍数与最大公约数的商等于两个数分别与最大公约数的商的积
即:若X、Y的最大公约数是A、最小公倍数是B,则有B/A=(X/A)(Y/A)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-23 08:38:01 | 显示全部楼层

感谢指导。:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 05:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表