注册 登录
编程论坛 C语言论坛

求最大公约数和最小公倍数 为什么运行出来的最大公约数不对啊

美美学c 发布于 2023-09-30 21:16, 932 次点击
#include <stdio.h>
#define M 10
int main() {
  int i,m,n,t,a,b,c,d;
scanf("%d,%d",&m,&n);
if(m<n)
{t=m;
m=n;
n=t;
}
for(a=1;a<m;a++)
for(b=1;b<=m;b++)
{c=m*a;
d=n*b;
if(d==c) break;
}
printf("最小公倍数为%d",d);
i=n%m;
t=i;
if(i!=0)
{i=n%t;
n=i;
i=t;
printf("最大公约数为%d",t);
}
else printf("最大公约数为%d",n);

return 0;
}
6 回复
#2
zbjzbj2023-09-30 22:51
我怎么就看不懂呢?

#3
邹生笑谈2023-10-01 15:34
回复 楼主 美美学c
什么,我输入【3.9】得出【27和3】,【4,6】得出【24,4】
算法我看不懂,但应该错了。上网找找怎么求公约数和公倍数吧(我也不会)。

另外,记得写注释,和进行代码缩进,还有最外层for别省略{},变量名有点意思可以看看别人怎么命名的。


程序代码:
//m>n最小公倍数肯定最大为n*m,最小为m
    n*m;
    //法一:用for从m到n*m一个个比对,符合第一个%以m和n都余0的条件的的就返回
   
//法2:网上百科说,先求最大公约数,再根据它求最小公倍数
   
#4
美美学c2023-10-01 20:16
回复 3楼 邹生笑谈
想到什么就写了 逻辑比较乱 算法也错了
好的 感谢大佬指教
#5
沈和2023-10-01 20:39
#include <stdio.h>
int main() {
  int i, m, n, t, a, b, c, d;
  scanf("%d,%d", &m, &n);
  if (m < n) { // ensure m >= n
    t = m;
    m = n;
    n = t;
  }

  // find m*a == n*b, m*a is 最小公倍数
  for (a = 1; a < m; a++) {
    for (b = 1; b <= m; b++) {
      c = m * a;
      d = n * b;
      if (d == c)
        goto out; // here
    }
  }

out:
  printf("最小公倍数为 %d\n", d);
  printf("最大公约数为 %d\n", m * n / d);

  return 0;
}


// 有更简单的方法来解决这个问题
// 最大公约数 Greatest Common Divisor
// 辗转相除法
// int gcd(int a, int b) { return a == 0 ? b : gcd(b % a, a); }

// 最小公倍数 Leatest Common Multiple
// int lcm(int a, int b) { return a * b / gcd(a, b); }

// int main(void) {
//   int m, n;
//   scanf("%d,%d", &m, &n);
//   printf("gcd(%d,%d)=%d\n", m, n, gcd(m, n));
//   printf("lcm(%d,%d)=%d\n", m, n, lcm(m, n));
//   return 0;
// }


[此贴子已经被作者于2023-10-1 20:48编辑过]

#6
美美学c2023-10-02 20:09
回复 5楼 沈和
哇哇哇这个gcd,lcm太优美了
#7
美美学c2023-10-02 20:14
回复 5楼 沈和
大佬 为什么第一个程序的最小公约数直接输出m*n呢
!!!看见除d啦



[此贴子已经被作者于2023-10-2 20:17编辑过]

1