新手求解,输入m,n,输出m,n的最大公因数做小公倍数。

linuxmoge 2011-08-30 11:29:26
听说要用辗除法。看了几个源码没看懂。。。。求各位热心的朋友们帮帮我。。。求源码级详解。。。多谢了。。。
...全文
361 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
暮雨晨舟 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tianxiao1101 的回复:]
//求正整数m和n的最大公约数和最小公倍数
#include <stdio.h>
void main()
{
//先输入m和n
int m,n,t,y,x;
printf("请输入m和n的值");
scanf("%d %d",&m,&n);
//使m成为较大者
if(m<n)
{
t=m;
m=n;
n=t;
……
[/Quote]

++
tianxiao1101 2011-08-30
  • 打赏
  • 举报
回复
//求正整数m和n的最大公约数和最小公倍数
#include <stdio.h>
void main()
{
//先输入m和n
int m,n,t,y,x;
printf("请输入m和n的值");
scanf("%d %d",&m,&n);
//使m成为较大者
if(m<n)
{
t=m;
m=n;
n=t;
}
//开始求最大公约数---然后两数乘积除最大公约数得最小公倍数
x=m*n;
//方法是辗转相除法
do
{
y=m%n;
m=n;
n=y;
}
while(y!=0);
printf("最大公约数为:%d\n",m);
printf("最小公倍数为:%d",x/m);


}
bdmh 2011-08-30
  • 打赏
  • 举报
回复
如果看不懂,问了你也不懂,一步步调试,看结果
ouyh12345 2011-08-30
  • 打赏
  • 举报
回复
首先要理解算法的原理
ouyh12345 2011-08-30
  • 打赏
  • 举报
回复
单步调试那些源码,看看变量的值
紫色动力 2011-08-30
  • 打赏
  • 举报
回复
学习了,数论,呵呵
尘缘udbwcso 2011-08-30
  • 打赏
  • 举报
回复

#include <stdio.h>
void main()
{
int x, y, tmp, multiple;
printf("Input two numbers:\n");
printf("x = ");
scanf("%d", &x);
printf("y = ");
scanf("%d", &y);
multiple = x * y;
if(x > y)
{
tmp = x;
x = y;
y = tmp;
}
while(x != 0)
{
tmp = y % x;
y = x;
x = tmp;
}
multiple = multiple / y;
printf("maximum common divisor is %d\n", y);
printf("min common multiple is %d\n", multiple);
}

这是代码,单步运行看一下各个变量的值,应该就懂了
AnYidan 2011-08-30
  • 打赏
  • 举报
回复
输入两个不大的数值,设断点,单步
ken_scott 2011-08-30
  • 打赏
  • 举报
回复
先用辗转相除法求a和b的最大公约数c,
最小公倍数d=a*b/c,
防止溢出可改为c=a/c*b(但还是有可能溢出)

辗转相除法在大一的高等代数或高等数学上应该有的,
原理证明,楼主暂时可以不管!
原理是这样的:
(原定理的a,b,c是一个多项式,这里只考虑最简单的,就当都是个整数)
我们假设求a, b的最大公约数(最大公因子)
设d=a%b, 则d<b, 此时有a=b*x+d, 当a<b时其中的x是0,这不影响下面的证明:
因为a=b*x+d, 所以, 如果b和d有最大公因子c, 则有b=c*y, d=c*z, 其中y,z都为整数且互质(即最大公因子为1),
这时有a=b*x+d=(c*y)*x+(c*z)=c*(y*x+z), 而b=c*y,所以知道b和d的最大公因子必为a和b的一个因子,因为c可以被a除尽也可以被b除尽,
现在唯一要做的是c是不是最大的公因子,
我们只要证明y*x*z和y是互质的,就可以了,
这里可以用反证法,
假设g是二者(y*x*z和y)的一个最大公因子且不为1(所以g是y的一个因子),
则y*x+z=g*h, y=g*i,其中h与i互质,
因为g*h=y*x+z=(g*i)*x+z=g*(i*x)+z,
那么对等式g*h=g*(i*x)+z变换有g*(h-i*x)=z,
从而知g是z的一个因子,又因g是y的因子,
所以g是y和z的一个的公因子(大于1),这与y,z互质是相违背的,
所以二者(y*x*z和y)最大公因子为1,互说是互质的,也就有了c是a,b的最大公因子
这也是为什么算法的代码中有f(a,b)转化成f(b,a%b)这种形式来做的原因,因为这两者的最大公约数是一样的

楼主再结合代码看看吧
Gloveing 2011-08-30
  • 打赏
  • 举报
回复
数论基础、、、
ff007bit 2011-08-30
  • 打赏
  • 举报
回复
顶四楼~
首先,最大公约和最小公倍数之间存在数学关系,所以只用最大公约数就可以了
其次,用辗转相除
估计你看不懂是因为原理不懂,
gcd(m,n) = gcd(n, n%m) gcd(m,0)=m
就是这个公式(m>n)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧