C语言求最大公约数的代码

C语言求最大公约数的代码,第1张

你的代码,主要的错误在for循环里的判断条件,应该是a%i!=0&&b%i!=0

不等号;但是,是了很久,发现这样的算法或者说思路也是错误的!因为你这样找到的只是两个数的最小公约数,而非最大公约数的,你可以用原来的想法,i

两个数中较小者那个从大到小去循环,从而找到两个数的公约数,也就是(从大到小)倒这来找公约数;或者建议你考虑辗转相除法,辗转相除法的思路是这样的:若

m和n为这连个正整数,有:当m>n,m与n

的最大公约数等于

n

m%n的最大公约数当n=0

,m与

n

的最大公约数等于

m,以下是算法,使用for语句:#include<stdioh>

#include<windowsh>

int

main(){

int

a,b,m,n,r;

printf("输入两个正整数(请用逗号隔开):");

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

if(a>b)

{

m=a;

n=b;

}

else

{

m=b;

n=a;

}

for(r=b;r!=0;){

r=m%n;

m=n;

n=r;

}

printf("%d

%d

的最大公约数是:%d\n",a,b,m);

system("PAUSE");

return

0;

}

代码如下:

#include

int main()

{

int i,a,b,t;

scanf(%d%d,&a,&b);//输入数a,b

if(a>b)//比较a,b大小,如果a>b则交换,结果为a= 2; i--)//以较小的a为基数,每内次i减小1循环求最大公容约数

{

if (a % i == 0 && b % i == 0)//如果两数均能整除某数则该数为最大公约数

{

printf(最大公约数是:%dn,i);

break;//已得到最大公约数后跳出循环

}

}

if(i==1)//若循环到最后仍无最大公约数则i=1

printf(两数只能同时被1整除!n);

return 0;

}

首先要知道什么事最大公约数

最大公约数就是能被两者同时整除的最大数

比如5 25 那么5就是最大公约数

while(m!=0) 是判断m是不等于0的数,因为0不能做为分母的

r=n%m; r就是n%m的余数

n=m 是把m的值赋给n

m=r 是把r的值赋给m

首先,可以给n和m一个值,例如n=30,m=4

那么r=30%4=2,n=4,m=2

由此可以得到,最大公约数是 2

求差判定法.

如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60的最大公约数是6.

如果两个数相差较大,可以用大数减去小数的若干倍,一直减到差比小数小为止,差和小数的最大公约数就是原来两数的最大公约数.例如:求92和16的最大公约数.92-16=76,76-16=60,60-16=44,44-16=28,28-16=12,12和16的最大公约数是4,所以92和16的最大公约数就是4.

辗转相除法.

当两个数都较大时,采用辗转相除法比较方便.其方法是:

以小数除大数,如果能整除,那么小数就是所求的最大公约数.否则就用余数来除刚才的除数;再用这新除法的余数去除刚才的余数.依此类推,直到一个除法能够整除,这时作为除数的数就是所求的最大公约数.

例如:求4453和5767的最大公约数时,可作如下除法.

5767÷4453=1余1314

4453÷1314=3余511

1314÷511=2余292

511÷292=1余219

292÷219=1余73

219÷73=3

于是得知,5767和4453的最大公约数是73.

辗转相除法适用比较广,比短除法要好得多,它能保证求出任意两个数的最大公约数.

--------------------------------------------------------------------------------

小学数学温习过后,先来个两个数递归版的

int GetGCDRec(int n, int m)

{

if (m < n)

{

m ^= n;

n ^= m;

m ^= n;

}

if (n == 0)

return m;

else

return GetGCDRec(n, m % n);

}

辗转相除法,求一个数组中所有数的最大公约数

int GetGCD(int arr, int len)

{

int iMax = arr[0], iCurr, iRemainder;

for(int i = 1; i < len; i++)

{

iCurr = arr[i];

if (iMax < iCurr)

{

iMax ^= iCurr;

iCurr ^= iMax;

iMax ^= iCurr;

}

iRemainder = iMax % iCurr;

while (iRemainder)

{

iMax = iCurr;

iCurr = iRemainder;

iRemainder = iMax % iCurr;

}

iMax = iCurr;

}//for

return iMax;

}

最小公倍数就是乘积除以最大公约数

int GetLCM(int arr, int len)

{

int multiple = 1;

for (int i = 0; i < len; i++)

multiple = arr[i];

return multiple / GetGCD(arr, len);

}

#include&lt;stdioh&gt;

int a;

int _Y(int x,int y);

int main()

{

int a,b,c,d;

printf(“请输入数字:”);

scanf("%d,%d",&c,&d);//此处注意在输出的时候数字之间要打都好,不然输出结果错误

b=_Y(c,d);

a=cd/b;

printf(“最大公约数为:%d\n”,b);

printf(“最小公倍数为:%d\n”,a);

return 0;

}

int _Y(int x,int y)

{

int e;

if(x&lt;y)

{

e=x;

x=y;

y=e;

}

while((e=x%y)!=0)

{

x=y;

y=e;

}

return(y);

}

扩展资料:

while循环开始后,先判断条件是否满足,如果满足就执行循环体内的语句,执行完毕后再回来判断条件是否满足,如此无限重复;直到条件不满足时,执行while循环后边的语句。简单来讲就是说while循环是先判断后循环, 判断如果满足条件进入循环 本次循环后再次判断 。

举个例子:

do-while循环与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真, 如果为真则继续循环;如果为假, 则终止循环。因此, do-while循环至少要执行一次循环语句。 简单来讲就是说while循环是先循环后判断 。

举个例子:

总结:while循环是先判断后循环 ,而do–while循环是先循环后判断。

参考资料:

百度百科——while(循环语句及英文单词)

#include

<stdioh>

#include

<stdlibh>

//使用欧氏演算法求最大公约数

int

gcd(int

a,

int

b)

{

if

(a

<

b)

{

int

t

=

a;

a

=

b;

b

=

t;

}

if

(a

%

b

==

0)

{

return

b;

}

else

{

return

gcd(b,

a

%

b);

}

}

int

main()

{

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

int

a,

b;

scanf("%d",

&a);

scanf("%d",

&b);

printf("最大公约数为:%d",

gcd(a,

b));

return

0;

}

c语言求最大公约数代码:

#include<stdioh>

#include<windowsh>

#pragma warning(disable:4996)//因为是vs编译器,不承认scanf函数,其他编译器可忽略

int gcd(int i, int j)

{

int a;

if (i < j)//交换变量值

{

a = i;

i = j;

j = a;

}

while (j != 0){

a = i % j;

i = j;

j = a;

}

return i;

}

int main()

{

int x;

int y;

scanf("%d %d", &x, &y);

int c = gcd(x, y);

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

system("pause");

return 0;

}

解题分析:

极大公数,也称最大公约数、最大公因子,指两个或更多的整数共有约数中最大的一个;最小公倍数是指两个或多个整数共同拥有的倍数,称为它们的公倍数,而除0以外的最小公倍数称为两个整数的最小公倍数。最小公倍=两整数的乘积=最大公约数,因此如何确定最大公约数是关键。

由于2将 b=r1q2改为 b=r1q2,则b1r1的公约数必须是a1b公约数。因为一个数可以同时除 b和r1之外,那么就必须能够整除 a,因此,对于a1b,也就是 a的公约数。相反,如果一个数 d,能够同时整除a1b,则由1)式,就一定能整除r1,因此,它的公约数 d是b1r1。

以上就是关于C语言求最大公约数的代码全部的内容,包括:C语言求最大公约数的代码、c语言求最大公约数、c程序 最大公约数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9298333.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存