C语言算法——最大公约数

合集下载

c语言求最大公约数算法

c语言求最大公约数算法

c语言求最大公约数算法最大公约数(gcd,又称最大公因数、最大公因子、最大公测量、最大公公约)指的是两个或多个整数共有约数中最大的一个。

在数学里面,求最大公约数是很常见的问题。

在计算机科学中,求最大公约数也是一个经典的算法问题。

而C语言作为一门流行的编程语言,也提供了多种方法来求解最大公约数。

下面将介绍四种常见的求最大公约数的算法:欧几里德算法、辗转相除法、更相减损法和迭代法。

1.欧几里德算法欧几里德算法(Euclidean algorithm)是一种辗转相除法,用于求两个正整数的最大公约数。

它基于以下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。

具体的算法如下:```cint gcd(int a, int b) {if (b == 0) {return a;} else {return gcd(b, a % b);}}```该算法使用递归的方式求解最大公约数,当b等于0时,a即为最大公约数;否则递归调用gcd函数,传入参数b和a mod b。

2.辗转相除法辗转相除法(也称作长除法)是一种用于求两个正整数的最大公约数的算法。

它的基本思想是:用较大的数除以较小的数,然后再用除数除以余数,依次循环,直到余数为0为止。

最后一个除数即为最大公约数。

具体的算法如下:```cint gcd(int a, int b) {while (b != 0) {int temp = b;b = a % b;a = temp;}return a;}```该算法使用循环的方式求解最大公约数,直到b等于0为止。

每次循环将b和a mod b的值赋给a和b,直到b等于0,此时a即为最大公约数。

3.更相减损法更相减损法是一种古老的求最大公约数的方法,其基本思想是:用两个数中较大的数减去较小的数,然后用得到的差与原较小的数继续相减,直到得到结果为止。

最后的结果就是最大公约数。

具体的算法如下:```cint gcd(int a, int b) {while (a != b) {if (a > b) {a -= b;} else {b -= a;}}return a;}该算法使用循环的方式求解最大公约数,直到a等于b为止。

求最大公约数(GCD)的两种算法

求最大公约数(GCD)的两种算法

求最⼤公约数(GCD)的两种算法之前⼀直只知道欧⼏⾥得辗转相除法,今天学习了⼀下另外⼀种、在处理⼤数时更优秀的算法——Stein特此记载1.欧⼏⾥得(Euclid)算法⼜称辗转相除法,依据定理gcd(a,b)=gcd(b,a%b)实现过程演⽰: sample:gcd(15,10)=gcd(10,5)=gcd(5,0)=5C语⾔实现:1int Euclid_GCD(int a, int b)2 {3return b?Euclid_GCD(b, a%b):a;4 }2.Stein 算法⼀般实际应⽤中的整数很少会超过64位(当然现在已经允许128位了),对于这样的整数,计算两个数之间的模是很简单的。

对于字长为32位的平台,计算两个不超过32位的整数的模,只需要⼀个指令周期,⽽计算64位以下的整数模,也不过⼏个周期⽽已。

但是对于更⼤的素数,这样的计算过程就不得不由⽤户来设计,为了计算两个超过 64位的整数的模,⽤户也许不得不采⽤类似于多位数除法⼿算过程中的试商法,这个过程不但复杂,⽽且消耗了很多CPU时间。

对于现代密码算法,要求计算 128位以上的素数的情况⽐⽐皆是,设计这样的程序迫切希望能够抛弃除法和取模。

依据定理:gcd(a,a)=a,也就是⼀个数和其⾃⾝的公约数仍是其⾃⾝。

gcd(ka,kb)=k*gcd(a,b),也就是运算和倍乘运算可以交换。

特殊地,当k=2时,说明两个偶数的必然能被2整除。

当k与b互为质数,gcd(ka,b)=gcd(a,b),也就是约掉两个数中只有其中⼀个含有的因⼦不影响。

特殊地,当k=2时,说明计算⼀个偶数和⼀个奇数的时,可以先将偶数除以2。

C语⾔实现:1int Stein_GCD(int x, int y)2 {3if (x == 0) return y;4if (y == 0) return x;5if (x % 2 == 0 && y % 2 == 0)6return2 * Stein_GCD(x >> 1, y >> 1);7else if (x % 2 == 0)8return Stein_GCD(x >> 1, y);9else if (y % 2 == 0)10return Stein_GCD(x, y >> 1);11else12return Stein_GCD(min(x, y), fabs(x - y));13 }。

如何用c语言求最大公约数和最小公倍数

如何用c语言求最大公约数和最小公倍数

在这种方法里,先做除数的,后一步就成了被除数,这就是辗转相除法名字的来历吧。
int gcd( int n, int m )
{
if( m == 0 ) return n;
return gcd( m, n % m );
}
呵呵,够简单吧!
这个是辗转相除t a,b;
a=g_cd(m,n);
if (m>n) //最小公倍数=较大的数*(较小的数/最大公约数)
{
b=n;
b/=a;
return m*b;
}
else
{
b=m;
b/=a;
return n*b;
}
}
main()
}
else printf("Error!\n");
return 0;
}
★ 关于辗转相除法, 搜了一下, 在我国古代的《九章算术》中就有记载,现摘录如下:
约分术曰:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法,实际上就是辗转相除法。
否则 n 为最大公约数
<2> 最小公倍数 = 两个数的积 / 最大公约数
#include
int main()
{
int m, n;
int m_cup, n_cup, res; /*被除数, 除数, 余数*/
printf("Enter two integer:\n");

c语言最大公约数和最小公倍数的求法

c语言最大公约数和最小公倍数的求法

c语言最大公约数和最小公倍数的求法以C语言最大公约数和最小公倍数的求法为标题,本文将介绍如何使用C语言来计算两个数的最大公约数和最小公倍数。

最大公约数(Greatest Common Divisor,简称GCD)是指两个或多个整数共有的约数中最大的一个。

最小公倍数(Least Common Multiple,简称LCM)是指两个或多个整数公有的倍数中最小的一个。

我们来讨论如何计算两个数的最大公约数。

常见的求解最大公约数的方法有辗转相除法、欧几里得算法和更相减损法。

其中,辗转相除法是最常用且最简单的方法。

辗转相除法的思想是用较大的数除以较小的数,然后用得到的余数再去除以较小的数,直到余数为0为止。

最后一次的除数即为最大公约数。

下面是使用C语言编写的辗转相除法求最大公约数的代码:```#include <stdio.h>int gcd(int a, int b) {if (b == 0) {return a;} else {return gcd(b, a % b);}}int main() {int num1, num2;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);printf("最大公约数为:%d\n", gcd(num1, num2));return 0;}```代码中的`gcd`函数用于计算最大公约数,通过递归调用实现了辗转相除法。

`main`函数用于获取用户输入的两个整数,并调用`gcd`函数来计算最大公约数。

接下来,我们来讨论如何计算两个数的最小公倍数。

常见的求解最小公倍数的方法有通过最大公约数求解和直接计算两个数的乘积再除以最大公约数。

我们先介绍通过最大公约数求解最小公倍数的方法。

最小公倍数可以通过两个数之积除以最大公约数得到。

因此,我们只需要在上述的代码基础上进行一些修改即可:```#include <stdio.h>int gcd(int a, int b) {if (b == 0) {return a;} else {return gcd(b, a % b);}}int lcm(int a, int b) {int gcd_num = gcd(a, b);return (a * b) / gcd_num;}int main() {int num1, num2;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);printf("最大公约数为:%d\n", gcd(num1, num2)); printf("最小公倍数为:%d\n", lcm(num1, num2));return 0;}```在上述代码中,我们新增了一个`lcm`函数用于计算最小公倍数,该函数先调用`gcd`函数获得最大公约数,然后通过两个数之积除以最大公约数来计算最小公倍数。

c语言计算最公约数

c语言计算最公约数

c语言计算最公约数计算两个数的最大公约数是一个非常基础的问题,对于想要学习编程的人来说,是一个非常好的练习。

在C语言中,我们可以使用欧几里得算法计算最大公约数,下面就来详细介绍一下这个算法的实现方法。

一、欧几里得算法介绍欧几里得算法,又叫辗转相除法,其基本思想是:用较大的数去除较小的数,再用余数去除除数,如此反复,直到余数为零为止。

也可以用数学公式来表示:gcd(a,b) = gcd(b,a mod b) (其中gcd表示最大公约数,mod 表示取模操作)这个公式的意思是,要求a和b的最大公约数,就先求出b和a mod b的最大公约数,一直递归下去,直到余数为零为止,此时除数就是求出来的最大公约数。

二、C语言实现欧几里得算法在C语言中,我们可以使用递归函数来实现欧几里得算法,代码如下:```c#include <stdio.h>int gcd(int a, int b) {if (b == 0) { // 如果余数为零,则除数即为最大公约数return a;} else {return gcd(b, a % b); // 否则递归求解}}int main() {int a, b;printf("请输入两个整数:\n");scanf("%d%d", &a, &b);printf("最大公约数为:%d\n", gcd(a, b));return 0;}```代码中首先定义了一个递归函数gcd,参数为两个整数a和b,当b为0时,递归结束,此时a即为最大公约数;否则递归调用gcd 函数,把b和a mod b作为参数,不断递归,直到b为0。

在main函数中,首先读入两个整数a和b,然后调用gcd函数计算它们的最大公约数,并输出结果。

三、注意事项1. 当处理负数时,需要先将其变为正数再处理。

比如gcd(-12,18)应该等于gcd(12,18)。

【C语言】第七章作业

【C语言】第七章作业
修改源程序,把primer函数的定义放在main函数 之后,编译程。出现什么问题?如何修改?
如果要求输出100~200之间的素数,如何修改 main函数。
3.main函数实现
int main() { int i;
printf("100~200之间的素数有:"); for(i=100;i<=200;i++) if (primer(i)) printf("%d ",i);
{ printf("请输入一个大于2的整数:"); scanf("%d",&m);
} flag=primer(m); if (flag) printf("%d是素数。\n",m); else printf("%d不是素数。\n",m); return 0; }
3.运行程序
输入测试数据:17 输入测试数据:34 输入测试数据:2 输入测试数据:1 输入测试数据:0 分别测试程序的正确性。
convert(i); }运行结果是什么?
最小公倍数=(i*j)/最大公约数
1.最大公约数函数实现
int gongyue(int i,int j) { int t,r; if (j>i)
{t=i;i=j;j=t;} while( (r=i%j)!=0) {
i=j; j=r; } return(j); }
1.最小公倍数函数实现
int gongbei(int i,int j,int h) { return(i*j/h); }
9.运行程序
输入测试数据: I am No.201002,You are No.201003! 检测程序的正确性。 正确结果: 字母个数是:13 数字个数是:12 空格个数是:4 其它字符个数是:4

C语言实现求最大公约数的三种方法

C语言实现求最大公约数的三种方法

C语⾔实现求最⼤公约数的三种⽅法⽬录题⽬描述问题分析代码实现⽅法⼀:穷举法⽅法⼆:辗转相除法⽅法三:更相减损法题⽬描述求任意两个正整数的最⼤公约数问题分析最⼤公因数,也称最⼤公约数、最⼤公因⼦,指两个或多个整数共有约数中最⼤的⼀个。

a,b的最⼤公约数记为(a,b),同样的,a,b,c的最⼤公约数记为(a,b,c),多个整数的最⼤公约数也有同样的记号。

求最⼤公约数有多种⽅法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。

与最⼤公约数相对应的概念是最⼩公倍数,a,b的最⼩公倍数记为[a,b]。

——百度百科最⼤公因数的求法有不少,本⽂我将采⽤穷举法、辗转相除法、更相减损法三种⽅法,求两个正整数的最⼤公约数(最⼤公因数)。

代码实现⽅法⼀:穷举法穷举法(列举法),是最简单最直观的⼀种⽅法。

具体步骤为:先求出两个数的最⼩值min(最⼤公约数⼀定⼩于等于两个数的最⼩值),接着从最⼩值min递减遍历(循环结束条件为i > 0),如果遇到⼀个数同时为这两个整数的因数,则使⽤break退出遍历(退出循环),这时的遍历值i即为两个正整数的最⼤公约数。

#include <stdio.h>/*** @brief 获取两个正整数的最⼤公因数(穷举法)* @param num1 第⼀个正整数* @param num2 第⼆个正整数* @return 最⼤公因数*/int Get_Max_Comm_Divisor(int num1, int num2){int i = 0;//获取两个整数的最⼩值int min = num1 < num2 ? num1 : num2;//从两个数的最⼩值开始递减遍历for(i = min; i > 0; i--){//i为num1和num2的公倍数if(num1 % i == 0 && num2 % i == 0)break;}return i;}int main(){int num1 = 0, num2 = 0;puts("请输⼊两个正整数.");scanf("%d%d", &num1, &num2);printf("最⼤公约数为%d.\n", Get_Max_Comm_Divisor(num1, num2));运⾏结果⽅法⼆:辗转相除法辗转相除法⼜称欧⼏⾥得算法,是指⽤于计算两个⾮负整数a,b的最⼤公约数。

最小公倍数和最大公约数C语言算法分析

最小公倍数和最大公约数C语言算法分析
最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数.
求最小公倍数算法:
最小公倍数=两整数的乘积÷最大公约数
求最大公约数算法:
(1)辗转相除法
有两整数a和b:
①a%b得余数c
②若c=0,则b即为两数的最大公约数
m=a; n=b;
/* a, b不相等,大数减小数,直到相等为止。*/
while ( a!=b)
if (a>b) a=a-b;
else b=;
printf("The largest common divisor:%d\n", a);
printf("The least common multiple:%d\n", m*n/a);
③i++
④若i <= a(或b),则再回去执行②
⑤若i > a(或b),则t即为最大公约数,结束
改进:
①i= a(或b)
②若a,b能同时被i整除,则i即为最大公约数,
结束
③i--,再回去执行②
[cpp] view plain copy
#include<stdio.h>
void main () /*穷举法求最大公约数*/
if ( i % a == 0 && i % b ==0 ) break;
printf("The least common multiple:%d\n", i )
//多个数的最大公约数和最小公倍数
for (i= a; i>0; i-- )
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基本算法——辗转相除法
问题:输出两个正整数a,b,且0<a<b, 输出其最大公约数p和最小公倍数q
解法1——
p从a开始,检测p是否能同时整除a和b, 是则停止循环,不是则令p减1,继续检测。

q从b开始,检测q是否能同时被a和b整除,是则停止循环,不是则令q增1,继续检测。

源程序1
#include <stdio.h>
void main()
{
int a,b, p, q;
do{
printf("请输入a和b:\n"); scanf("%d%d",&a,&b);
} while ( a<0 || b<0 || a>b);
p=a;
while( a%p!=0 || b%p!=0) p--;
printf("这两个数的最大公约数是%d\n",p);
q=b;
while( q%a!=0 || q%b!=0) q++;
printf("这两个数的最小公倍数是%d\n",q);
}
改进——已知整数a,b及其最大公约数p,则直接可推算出最小公倍数q:
q= a*b/p;
源程序2
#include <stdio.h>
void main()
{
int a,b, p, q;
do{
printf("请输入a和b:\n"); scanf("%d%d",&a,&b);
} while ( a<0 || b<0 || a>b);
p=a;
while( a%p!=0 || b%p!=0) p--;
printf("这两个数的最大公约数是%d\n",p);
q= a*b/p;
printf("这两个数的最小公倍数是%d\n",q);
}
解法1的缺点:效率低。

例如a=1397, b=2413,其最大公约数p=127,为得到p,共循环了1397-127+1=1171次。

如何提高效率?
解法2——辗转相除法,在西方称为Euclid(欧几里德)算法。

以计算(1397,2413)的最大公约数为例:
以大数2413为被除数,以小数1397为除数,相除得:商为1,余数为1016以除数1397为被除数,以余数1016为除数,相除得:商为1,余数为381以除数1016为被除数,以余数381为除数,相除得:商为2,余数为254以除数381为被除数,以余数254为除数,相除得:商为1 ,余数为127以除数254为被除数,以余数127为除数,相除得:商为2,余数为0 ~~发现能整除,则127就是最大公约数。

整个计算过程为:
数学证明:b=as+r(0≤r ≤b-1),且a,b的最大公约数用符号(a,b)代表
若r=0,显然(a,b)=a;
若r≠0,由于b=as+r,每个能整除a,r的整数都能整除b→能同时整除a,b, 故有
(a,r) | (a,b)
另一方面,r=b-aq,每个能整除a,b的整数都能整除r →能同时整除a,r, 故有
(a,b) | (a,r)
因此(a,b)=(a,r)
辗转相除法源程序:
#include <stdio.h>
void main()
{
int a,b,r, m;
do{
printf("请输入a和b:\n");
scanf("%d%d",&a,&b);
}while( a<0 || b<0 ||a>b);
m=a*b;
do{
r=b%a;
b=a;
a=r;
}while(r!=0);
printf("这两个数的最大公约数是%d\n",r);
printf("这两个数的最小公倍数是%d\n", m/r); //不能写“a*b/r”}。

相关文档
最新文档