首页 如何用c语言求最大公约数和最小公倍数.txt

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

举报
开通vip

如何用c语言求最大公约数和最小公倍数&#46;txt如何用c语言求最大公约数和最小公倍数.txt 本文由ekoi贡献 输入两个正整数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; /*被除数, 除数, 余数*...

如何用c语言求最大公约数和最小公倍数&#46;txt
如何用c语言求最大公约数和最小公倍数.txt 本文由ekoi贡献 输入两个正整数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(";??quot;, &m, &n); if (m > 0 && n >0) { m_cup = m; n_cup = n; res = m_cup ?_cup; while (res != 0) { m_cup = n_cup; n_cup = res; res = m_cup ?_cup; } printf(";Greatest common divisor: ?n";, n_cup); printf(";Lease common multiple : ?n";, m * n / n_cup); } else printf(";Error!\n";); return 0; } ? 关于辗转相除法, 搜了一下, 在我国古代的《九章算术》中就有记载,现摘录如下: 约分术曰:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。” 其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法,实际上就是辗转相除法。 辗转相除法求最大公约数,是一种比较好的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 ,比较快。 对于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,„„直到余数为零为止。 在这种方法里,先做除数的,后一步就成了被除数,这就是辗转相除法名字的来历吧。 int gcd( int n, int m ) { if( m == 0 ) return n; return gcd( m, n ? ); } 呵呵,够简单吧~ 这个是辗转相除的递归形式~ 至于辗转相除,可以baidu下,有很多介绍 #include<stdio.h> void main() { int a,b,t; int r,x; printf(";Input two numbers!\n";); scanf(";,?quot;,&a,&b); x = a * b; if (a < b) { t = a; a = b; b = t; } while (b != 0) { r = a ?; a = b; b = r; } printf(";最大公约数为:?n";,a); printf(";最小公倍数为:?n";,x/a); } #include <stdio.h> int cal(int a,int b) { if(a<b){ int t=a; a=b; b=t; } if(a?=0)return b; return cal(b,a?; } int main() { int a,b; scanf(";?quot;,&a,&b); printf(";??n";,cal(a,b),a*b/cal(a,b)); return 0; } 欧几里德算法也就是辗转相除法,有着2000年的历史了。欧几里德算法依据的算法理论是一 个定理: gcd(a,b) = gcd(b,a mod b)。 common divisor: int gcd(int m, int n) { if(m<n) { int tmp; tmp=m; m=n; n=tmp; } if(n==0) { return m; } else return gcd(n,m?; } common multiple: int gbs(int m, int n) { return m*n/(gcd(m,n)); } #include int main() { int m, n; int m_cup, n_cup, res; /*被除数, 除数, 余数*/ printf(";Enter two integer:\n";); scanf(";??quot;, &m, &n); if (m > 0 && n >0) { m_cup = m; n_cup = n; res = m_cup ?_cup; while (res != 0) { m_cup = n_cup; n_cup = res; res = m_cup ?_cup; } printf(";Greatest common divisor: ?n";, n_cup); printf(";Lease common multiple : ?n";, m * n / n_cup); } else printf(";Error!\n";); return 0; } 楼主学习着用最优算法吧,像这样的题它考的就是你会不会用最优算法去写程序,从1开始遍历,是最古老,花费时间最多的算法,它往往是不可取的 楼上2位写的算法其实都是一个意思 我用for循环描述一下吧 int g_cd(int m, int n) //最大公约数算法 { int a,b; //小的为a,大的为b if (m>n) { a=n; b=m; } if (m<n) { a=m; b=n; } if (m==n) return m; int temp=0; for(;b?=0;a=temp? //b与a的相除的余数肯定含有最大公约数 { temp=b; b=a; //每次计算之后将上一轮的a给下一轮temp计算,从余数里找 } return a; //当不满足循环条件时,a就为最大公约数 } int lcm(int m, int n) //最小公倍数算法 { int 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() { int p,r,n,m,temp; printf(";Please enter 2 numbers n,m:";); scanf(";,?quot;,&n,&m);//输入两个正整数. if(n<m)//把大数放在n中,把小数放 在m中. {temp=n; n=m; m=temp; } p=n*m;//P是原来两个数n,m的乘积. while(m!=0)//求两个数n,m的最大公约数. { r=n? n=m; m=r; } printf(";Its MAXGongYueShu:?n";,n);//打印最大公约数. printf(";Its MINGongBeiShu:?n";,p/n);打印最小公倍数. 基本原理如下: 用欧几里德算法(辗转相除法)求两个数的最大公约数的步骤如下: 先用小的一个数除大的一个数,得第一个余数; 再用第一个余数除小的一个数,得第二个余数; 又用第二个余数除第一个余数,得第三个余数; 这样逐次用后一个数去除前一个余数,直到余数是0为止。那么,最后一个除数就是所求的 最大公约数(如果最后的除数是1,那么原来的两个数是互质数)。 例如求1515和600的最大公约数, 第一次:用600除1515,商2余315; 第二次:用315除600,商1余285; 第三次:用285除315,商1余30; 第四次:用30除285,商9余15; 第五次:用15除30,商2余0。 1515和600的最大公约数是15。 两个正整数的最小公倍数=两个数的乘积?两个数的最大公约数 由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。这就是说,求两个数的最 小公倍数,可以先求出两个数的最大公约数,再用这两个数的最大公约数去除这两个数的积, 所得的商就是两个数的最小公倍数。 例 求105和42的最小公倍数。 因为105和42的最大公约数是21, 105和42的积是4410,4410?21,210, 所以,105和42的最小公倍数是210。 #include <stdio.h> void main() { int i,j,k; long m; printf(";please input i,j:\n";); scanf(";?quot;,&i,&j); m=i*j; if(i<j) {i=i^j; j=j^i; i=i^j;} while(i?=0) {k=i? i=j; j=k;} printf(";gcd=,lcm=?\n";,j,m/j); } 给,已经编译运行确认: #include<conio.h> #include<stdio.h> int main() { int p,r,n,m,temp; printf(";Please enter 2 numbers n,m:";); scanf(";??quot;,&n,&m);//输入两个正整数. if(n<m)//把大数放在n中,把小数放在m中. { temp=n; n=m; m=temp; } p=n*m;//P是原来两个数n,m的乘积. while(m!=0)//求两个数n,m的最大公约数. { r=n? n=m; m=r; } printf(";最大公约数为: ?n";,n);//打印最大公约数. printf(";最小公倍数为: ?n";,p/n);//打印最小公倍数. getch(); return 1; } 在网上找了一个程序,个人觉得不错,以此共享! main() { unsigned int m,n,a,b,c,i,s; printf(";please input two numbers:";); scanf(";?quot;,&m,&n); a=min(m,n); b=max(m,n); for(i=1;i<=b;i++)//求a,b两数也即m和n的最小公倍数 { c=a*i; if(c?=0)break; } for(s=a;s>=1;s--)//求a,b两数的最大公约数 { if(b?=0&&a?=0)break; } printf(";Β?%d的最大公约数是%d,最小公倍数是?n";,m,n,s,c);//此处若TC不支持中文输 入时,应改 写成适当的英文表示形式. } int max(int x,int y) { int z; if(x>y)z=x; else z=y; return(z); } int min(int d,int e) { int h; if(d>e)h=e; else h=d; return(h); } #include <stdio.h> #include <math.h> int main(void) { int x; scanf(";?quot;,&x); printf(";x: ?absolute value: ?n";, x, abs(x)); return 0; } 觉得这个代码好的话给我加分哦! #include<math.h> int 型 int abs(int x); long 型 long labs(int x); 浮点数 float double double fabs(double x);
本文档为【如何用c语言求最大公约数和最小公倍数&#46;txt】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_266065
暂无简介~
格式:doc
大小:31KB
软件:Word
页数:15
分类:生活休闲
上传时间:2017-09-30
浏览量:27