c语言求最大公约数辗转相除法,c语言用辗转相除法求最大公约数

http://www.itjxue.com  2023-01-05 05:49  来源:未知  点击次数: 

c语言中,用辗转相除法计算两个数的最大公约数的具体方法是怎样的?

#include stdio.h

int gcd(int a, int b) {

int r;

do {

r = a % b;

a = b;

b = r;

} while (r);

return a;

}

int main(void) {

int a, b;

printf("Input two integers: \n");

scanf("%d%d", a, b);

printf("The greatest common divisor is: %d\n", gcd(a, b));

return 0;

}

原理:

辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:

1. 若 r 是 a ÷ b 的余数,则

gcd(a,b) = gcd(b,r)

2. a 和其倍数之最大公因子为 a。

另一种写法是:

1. a ÷ b,令r为所得余数(0≤rb)

若 r = 0,算法结束;b 即为答案。

2. 互换:置 a←b,b←r,并返回第一步

求最大公约数c语言

c语言求最大公约数有辗转相除法、更相减损术、穷举法三种。

辗转相除法。算法简介:将两个数a,b相除,如果余数c不等于0,就把b的值给a,c的值给b,直到c等于0,此时最大公约数就是b。

更相减损术。算法简介:将两个数中较大的数a减去较小的数b,如果差c等于0,那么最大公约数为b,如果不等于0,则将b的值给a,c的值给b,继续相减直到差等于0。

穷举法。算法简介:将两个数a,b中较小的值赋给i,将a除以i,b也除以i,若两者的余数同时为0时,此时的i就是两者的最大公约数。若不等于0,则将i-1,继续将a除以i,b除以i,直至余数同时为0。

最大公约数:

最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。

早在公元前300年左右,欧几里得就在他的著作《几何原本》中给出了高效的解法——辗转相除法。辗转相除法使用到的原理很聪明也很简单,假设用f(x,y)表示x,y的最大公约数,取k=x/y,b?=x%y,则x=ky+?b,如果一个数能够同时整除x和y,则必能同时整除b和y。

而能够同时整除b和y的数也必能同时整除x和y,即x和y的公约数与b和y的公约数是相同的,其最大公约数也是相同的,则有f(x,y)=f(y,x%y)(y0),如此便可把原问题转化为求两个更小数的最大公约数,直到其中一个数为0,剩下的另外一个数就是两者最大的公约数。

如何用C语言求两个数的最大公约数的三种算法

1、相减法

#includelt;stdio.hgt;

int main()

{

int a,b;

int c=0;//计数器

while(1)//循环判断的作用

{

printf("输入两个数字求最大公约数:");

scanf("%d%d",a,b);

while(a!=b)

{

if(agt;b)

a=a-b;

else

b=b-a;

c++;

}

printf("最大公约数是:%d\n",a);

printf("%d\n",c);

}

return 0;

}

运行效果:

2、辗转相除法:

#includelt;stdio.hgt;

int a,b,temp;

int Division(){

printf("请输入两个数(a,b):\n");

scanf("%d,%d",a,b);

if(alt;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、穷举法

#includelt;stdio.hgt;

int main()

{

int a,b,c;

int d=0;//计数器

while(1)

{

printf("输入两个数字求最大公约数:");

scanf("%d%d",a,b);

c=(agt;b)?b:a;//三目运算符

while(a%c!=0||b%c!=0)

{

c--;

d++;

}

printf("最大公约数是:%d\n",c);

printf("%d\n",d);

}

return 0;

}

C语言程序:用“辗转相除法”求两个正整数的最大公约数(程序填空)

#define _CRT_SECURE_NO_WARNINGS

#include stdio.h

#include stdlib.h

int main()

{

int a, b,r;

scanf("%d %d", a, b);

while (b != 0)//当其中一个数为0,另一个数就是两数的最大公约数

{

r = a%b;

a = b;

b = r;

}

printf("最大公约数%d\n", a);

system("pause");

}

例子:

105252

252%105=42;

105%42=21;

42%21=0;

即21为105与252的最大公约数

扩展资料:

while语句若一直满足条件,则会不断的重复下去。但有时,需要停止循环,则可以用下面的三种方式:

一、在while语句中设定条件语句,条件不满足,则循环自动停止。

如:只输出3的倍数的循环;可以设置范围为:0到20。

二、在循环结构中加入流程控制语句,可以使用户退出循环。

1、break流程控制:强制中断该运行区内的语句,跳出该运行区,继续运行区域外的语句。

2、continue流程控制:也是中断循环内的运行操作,并且从头开始运行。

c语言编程,利用辗转相除法求公约数

辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。

其原理如下:

设两数为a、b(ba),用gcd(a,b)表示a,b的最大公约数,r=a (mod b) 为a除以b以后的余数,k为a除以b的商,即a÷b=k.......r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。

第一步:令c=gcd(a,b),则设a=mc,b=nc

第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c

第三步:根据第二步结果可知c也是r的因数

第四步:可以断定m-kn与n互质【否则,可设m-kn=xd,n=yd (d1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公约数成为cd,而非c,与前面结论矛盾】

从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。

证毕。

以上步骤的操作是建立在刚开始时r!=0的基础之上的。即m与n亦互质。

按照其规则,C语言实现如下:

int?GCD(int?a,int?b)

{return?b==0?a:GCD(b,a%b);}

(责任编辑:IT教学网)

更多

推荐Fireworks教程文章