两个数的最大公约数c语言
‘壹’ c语言求两个数最大公约数
我觉得思路就有问题。
首先,在循环之前就应该找出较小的数,然后从较小的数开始自减,判断能否被两个数整除。
因为两个数的最大公约数一定是介于1到较小数之间的。
如果还要保持输入的正确输出的话,找出较小数的操作不要放在循环内。
参考如下:
voidmain()
{
inta,b,gcd;
printf("Inputtwonumber:");
scanf("%d%d",&a,&b);
if(a==b)
{
printf("Thetwonumberis%dand%d.Theirgcdis%d. ",a,b,a);
return;
}
if(a>b)
gcd=b;
else
gcd=a;
while(gcd>0)
{
if(a%gcd==0&&b%gcd==0)
break;
else
gcd--;
}
printf("Thetwonumberis%dand%d.Theirgcdis%d. ",a,b,gcd);
}
‘贰’ 如何用C语言求两个数的最大公约数的三种算法
1、相减法
#include<stdio.h>
int
main()
{
int
a,b;
int
c=0;//计数器
while(1)//循环判断的作用
{
printf("输入两个数字求最大公约数:");
scanf("%d%d",&a,&b);
while(a!=b)
{
if(a>b)
a=a-b;
else
b=b-a;
c++;
}
printf("最大公约数是:%d\n",a);
printf("%d\n",c);
}
return
0;
}
运行效果:
2、辗转相除法:
#include<stdio.h>
int
a,b,temp;
int
Division(){
printf("请输入两个数(a,b):\n");
scanf("%d,%d",&a,&b);
if(a<b){
temp=a;
a=b;
b=temp;
}
while(a%b!=0){
temp=a%b;
a=b;
b=temp;
}
printf("最大公约数为:%d\n",b);
return
0;
}
3、穷举法
#include<stdio.h>
int
main()
{
int
a,b,c;
int
d=0;//计数器
while(1)
{
printf("输入两个数字求最大公约数:");
scanf("%d%d",&a,&b);
c=(a>b)?b:a;//三目运算符
while(a%c!=0||b%c!=0)
{
c--;
d++;
}
printf("最大公约数是:%d\n",c);
printf("%d\n",d);
}
return
0;
}
‘叁’ c语言求最大公约数
1、新建一个C语言源程序,这里使用Visual C++6.0的软件:
‘肆’ C语言程序:求两个数的最大公约数和最小公倍数。
#include<iostream>
using
namespace
std;
int
f(int
p,int
q);
int
g(int
u,int
v,int
w);
int
main()
{
int
x,y,m,n;
cout<<"请输入两个整数"<<endl;
cin>>x>>y;
m=f(x,y);
n=g(x,y,m);
cout<<"这两个数的最大公约数是"<<m<<"\n这两个数的最小公倍数是"<<n<<endl;
}
int
f(int
p,int
q)
{
int
r;
p>q?r=q:r=p;
//找两个数中最小的最小的
for(;p%r!=0||q%r!=0;r--);
return
r;
}
int
g(int
u,int
v,int
w)
//w是最大公约数
{
int
g;
g=u*v/w;
return
g;
}
‘伍’ 怎么用C语言编辑出两个数的最大公约数呀谢谢!!
#include
"stdio.h"
main()
{
int
x=0,y=0;
/*被求公倍数的两个数*/
int
z
=
0;
/*保存临时的取余结果*/
int
count
=
3;
/*循环计数*/
int
tmp
=
0;
/*交换x,y的临时变量
*/
/*循环3次获得用户输入,直到输入正确,或超过次数*/
while(count
>
0)
{
printf("please
input
two
numbers\n");
if(2
!=
scanf("%d%d",&x,&y))
/*如果正确的输入参数不等于2
就结束这次循环,并给出错误信息*/
{
fflush(stdin);
/*清空输入缓冲区,否则下次输入会有错误*/
count--;
printf("error:This
figure
must
be
imported
!
you
still
have
%d
opportunities.\n",count);
}
else
if(
x
==
0
||
y
==
0)
{
count--;
printf("error:The
input
not
equal
to
0!
you
still
have
%d
opportunities.\n",count);
}else
break;
}
/*如果输入次数超过限制,则退出程序并给出提示*/
if(count
<=
0)
{
printf("You
have
no
chance
of
withdrawal
proceres
");
return;
}
/*将两个数的大小位置固定,x永远大于y
方便下面判断*/
if(x
<
y)
{
tmp
=
x;
x
=
y;
y
=
tmp;
}
/*用辗转相除法求出最大公倍数*/
while(
x
%
y
!=
0)
{
printf("%d\t/\t%d\tremainder\t%d\n",x,y,(x
%
y));
/*输出求解过程*/
z
=
x
%
y;
x
=
y;
y
=
z;
}
printf("%d\t/\t%d\tremainder\t%d\n",x,y,(x
%
y));
/*输出最后一次求解过程*/
printf("the
result
is
%d\n",y);
}
‘陆’ c语言求两个数的最大公约数
思路:求两个数的最大公约数使用辗转相除法。
辗转相除法,
又名欧几里德算法(Euclidean
algorithm)乃求两个正整数之最大公因子的算法。原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。
参考代码:
#include <stdio.h>
int main()
{
int x,y,z;
scanf("%d%d",&x,&y);
while(x!=0)
{
z=x%y;
x=y;
y=z;
}
printf("%d\n",z);
return 0;
}
/*
运行结果:
6 27
3
*/
‘柒’ C语言:求两数的最大公约数
我的方法,很笨。请勿见笑
// 函数 GetCommonDivisor: 求两个数的最大公约数
int GetCommonDivisor( int x , int y )
{
// 取x,y的小者作为运算的起始点,逐渐减小,直到x,y都能整除为止
int Max = min( x,y );
while( Max >= 1 )
{
if( ( x % Max == 0 ) && ( y % Max == 0 ) )
// 找到最大公约数返回
return Max;
Max --;
}
return 1;
}
‘捌’ 2个数的最大公约数和最小公倍数 C语言怎么求
输入两个正整数m和n,
求其最大公约数和最小公倍数.
<1>
用辗转相除法求最大公约数
算法描述:
m对n求余为a,
若a不等于0
则
m
<-
n,
n
<-
a,
继续求余
否则
n
为最大公约数
<2>
最小公倍数
=
两个数的积
/
最大公约数
#include
int
main()
{
int
m,
n;
int
m_cup,
n_cup,
res;
/*被除数,
除数,
余数*/
printf("Enter
two
integer:\n");
scanf("%d
%d",
&m,
&n);
if
(m
>
0
&&
n
>0)
{
m_cup
=
m;
n_cup
=
n;
res
=
m_cup
%
n_cup;
while
(res
!=
0)
{
m_cup
=
n_cup;
n_cup
=
res;
res
=
m_cup
%
n_cup;
}
printf("Greatest
common
divisor:
%d\n",
n_cup);
printf("Lease
common
multiple
:
%d\n",
m
*
n
/
n_cup);
}
else
printf("Error!\n");
return
0;
}
★
关于辗转相除法,
搜了一下,
在我国古代的《九章算术》中就有记载,现摘录如下:
约分术曰:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法,实际上就是辗转相除法。
辗转相除法求最大公约数,是一种比较好的方法,比较快。
对于52317和75569两个数,你能迅速地求出它们的最大公约数吗?一般来说你会找一找公共的使因子,这题可麻烦了,不好找,质因子大。
现在教你用辗转相除法来求最大公约数。
先用较大的75569除以52317,得商1,余数23252,再以52317除以23252,得商2,余数是5813,再用23252做被除数,5813做除数,正好除尽得商数4。这样5813就是75569和52317的最大公约数。你要是用分解使因数的办法,肯定找不到。
那么,这辗转相除法为什么能得到最大公约数呢?下面我就给大伙谈谈。
比如说有要求a、b两个整数的最大公约数,a>b,那么我们先用a除以b,得到商8,余数r1:a÷b=q1…r1我们当然也可以把上面这个式子改写成乘法式:a=bq1+r1------l)
如果r1=0,那么b就是a、b的最大公约数3。要是r1≠0,就继续除,用b除以r1,我们也可以有和上面一样的式子:
b=r1q2+r2-------2)
如果余数r2=0,那么r1就是所求的最大公约数3。为什么呢?因为如果2)式变成了b=r1q2,那么b1r1的公约数就一定是a1b的公约数。这是因为一个数能同时除尽b和r1,那么由l)式,就一定能整除a,从而也是a1b的公约数。
反过来,如果一个数d,能同时整除a1b,那么由1)式,也一定能整除r1,从而也有d是b1r1的公约数。
这样,a和b的公约数与b和r1的公约数完全一样,那么这两对的最大公约数也一定相同。那b1r1的最大公约数,在r1=0时,不就是r1吗?所以a和b的最大公约数也是r1了。
有人会说,那r2不等于0怎么办?那当然是继续往下做,用r1除以r2,……直到余数为零为止。
在这种方法里,先做除数的,后一步就成了被除数,这就是辗转相除法名字的来历吧。
‘玖’ c语言编程,求两个数的最大公约数和最小公倍数
这样写:
#include
void
main()
{
int
m,n,i,r,temp;
printf("请输入第一个数的值:
");
scanf("%d",&m);
printf("请输入第二个数的值:
");
scanf("%d",&n);
if(n>m)
{
temp=m;
m=n;
n=temp;
}
i=n;
while(i%m!=0)
{
i=i+n;
}
printf("最小公倍数是:%d
\n",i);
r=m%n;
while(r!=0)
{
m=n;
n=r;
r=m%n;
}
printf("最大公约数是:%d
\n",n);
}
图: