求输入两个数的最大公约数

ming508 2003-10-11 08:28:26
请各位大虾赶快救命,给出用c++/c编写的求输入两个数的最大公约数的程序给我看看
多谢!!一定给分
...全文
459 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
dama2003 2003-10-11
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
int min; //定义一个全局变量来保存最小公倍数
int max(int a,int b) //定义算法函数
{
int n=1; //先定义两个数的最大公约数是1
int sum=1; //设置最终的最大公约数为1
for(n=1;n<=(a>b?b:a);n++)
{
if(a%n==0&&b%n==0)
{
sum=sum*n;
a=a/n;
b=b/n;
n=1;
continue;
} //每求出一个公共除数后就将原数a和b设置为(a/n)和(b/n)
}
min=sum*a*b; //最小公倍数
return sum; //最大公约数
}

main()
{
int Fnumber,Snumber;//输入的两个数
cout<<"please enter the First number: ";
cin>>Fnumber;
cout<<"please enter the Second number: ";
cin>>Snumber;
int Gnumber=max(Fnumber,Snumber);
cout<<"the max number is: "<<Gnumber<<endl;
cout<<"the min number is: "<<min<<endl;
return 0;
}

我的做法比较菜,别见笑:) (我是菜鸟)
laomai 2003-10-11
  • 打赏
  • 举报
回复
而展转相除法的理论基础如下:
设a,b为自然数,根据数论中的一个结论,必有一个唯一的数对(k,r)满足a=kb+r,其中k>=0且
0<=r<b.k就是所谓的商,r就是所谓的余数。
设gcd(a,b)表示他们俩的最大公倍数,则必有
gcd(a,b)=gcd(b,r)
反复利用这个结论,就是展转相除法


cxjddd 2003-10-11
  • 打赏
  • 举报
回复
/* Abs<N>::ans 求 N 的绝对值
*/
template <int N>
struct Abs
{
static const int
ans = (N >= 0) ? N : -N;
};

/* Max<M, N>::ans 求 M 与 N 中最大值
*/
template <int M, int N>
struct Max
{
static const int
ans = (M > N) ? M : N;
};

/* Min<M, N>::ans 求 M 与 N 中最小值
*/
template <int M, int N>
struct Min
{
static const int
ans = (M < N) ? M : N;
};

/* GCD<M, N>::ans 求 M 与 N 的最大公约数
*/
template <int M, int N>
struct GCD
{
private:
static const int
MM = Max<Abs<M>::ans, Abs<N>::ans>::ans; // MM 应大于 NN
static const int
NN = Min<Abs<M>::ans, Abs<N>::ans>::ans; // 这样有利于除法

public:
static const int
ans = (MM % NN == 0) ? NN : GCD<NN, MM % NN>::ans;
};

/* GCD<M, 1>::ans 特化,最终形态之一,结果是 M
*/
template <int M>
struct GCD<M, 1>
{
static const int
ans = 1;
};

/* GCD<M, 0>::ans 特化,另一种结束态,没什么用,阻止编译程序错误地编译下去
*/
template <int M>
struct GCD<M, 0>
{
static const int
ans = 0; // 除数不能为 0,示错
};

/* GCD<0, M>::ans 容错,防止 0 的出现
*/
template <int M>
struct GCD<0, M>
{
static const int
ans = 0; // 除数不能为 0,示错
};

/* GCD<0, 1>::ans 容错,防止 0 和 1 同时出现
*/
template <>
struct GCD<0, 1>
{
static const int
ans = 0; // 除数不能为 0,示错
};
ming508 2003-10-11
  • 打赏
  • 举报
回复
为什么说我的密码不对阿
laomai 2003-10-11
  • 打赏
  • 举报
回复
告诉你我那个思路中的关键部分吧
,设a,b为自然数,gcd(a,b)表示他们俩的最大公倍数,则必有
gcd(a,b)=gcd(a,b+a)=gcd(a,b-a),证明你自己写吧。反复利用这个结论,就是我的展转相减法。
laomai 2003-10-11
  • 打赏
  • 举报
回复
给分的话,点“管理”就行了
Oliver2002 2003-10-11
  • 打赏
  • 举报
回复
1。将小的那个数(m)看作除数,较大的那个数(n)做被除数,
2。用n除以m所得的余数作为m,将原除数做为n,
3。重复1 2直至m为0。
最后的n就为最大公约数
laomai 2003-10-11
  • 打赏
  • 举报
回复
不必了,该函数的返回值就是最大公倍数,你可以直接运行一下试试啊。我给你几个中间数据作为证明吧
设x=190,y=34
x y x-y y-x
190 34 156
156 34 122
122 34 88
88 34 54
54 34 20
20 34 14
20 14 6
6 14 8
6 8 2
6 2 4
4 2 2
2 2
因此190和34的最大公倍数是2
20 14
ming508 2003-10-11
  • 打赏
  • 举报
回复
多谢你们拉

aflyinghorse 2003-10-11
  • 打赏
  • 举报
回复
int gcd(int v1, int v2)
{
while(v2)
{
int temp = v2;
v2 = v1 % v2;
v1 = temp;
}
return v1;
}
laomai 2003-10-11
  • 打赏
  • 举报
回复
证明我就不写了,挺长的。如果你有兴趣钻研,我再贴出来
ming508 2003-10-11
  • 打赏
  • 举报
回复
知道啦 谢谢你啊,请问一下怎么给分阿,你帮了我一个大忙我一道给你分的
ming508 2003-10-11
  • 打赏
  • 举报
回复
请问是不是循环利用刚才那个算法阿
Oliver2002 2003-10-11
  • 打赏
  • 举报
回复
int getfactor(int m,int n)
{
int temp;
if(m>n)
{
temp=m;
m=n;
n=temp;
}
while (m!=0)
{
temp=n%m;
n=m;
m=temp;
}
return n;
}
ming508 2003-10-11
  • 打赏
  • 举报
回复
可以给我讲一下思路吗?
laomai 2003-10-11
  • 打赏
  • 举报
回复
/*find the greatest common divisor*/
int fcd(int x,int y)
{
while(x!=y)
{
if(x>y)
{
x=x-y;
}
else
{
y=x-y;
}
}
return x;
}
ming508 2003-10-11
  • 打赏
  • 举报
回复
好的谢谢你快给我把
真是救命阿
laomai 2003-10-11
  • 打赏
  • 举报
回复
是作业题吗?我先把算法给你,如果你还是不会,再给你代码

69,369

社区成员

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

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