最大公约数数问题

欧几里得算法,辗转相除法,能很快求得最大公约数

f(20,15)=f(15,5)=f(5,0)=5

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 //最大公约数
 4 int gcd(int x,int y)
 5 {
 6     if(x<y)
 7         return gcd(y,x);
 8     if(y==0)
 9         return x;
10     else
11         return gcd(y,x%y);
12
13 }
14
15 int main()
16 {
17     int x=10,y=20;
18     printf("%d  %d   最大公约数%d\n",x,y,gcd(x,y));
19     return 0;
20 }
时间: 2024-10-13 16:04:26

最大公约数数问题的相关文章

poj 3101 Astronomy(分数的最小公倍数)

http://poj.org/problem? id=3101 大致题意:求n个运动周期不全然同样的天体在一条直线上的周期. 这题我是看解题报告写的,没想到选用參照物,用到了物理中的角速度什么的. 由于n个天体的周期已知,那么它们的角速度为vi = 2*pi/Ti,若统一选第0个天体为參照物,那么其余天体的相对速度vi' =  2*pi*(T0-Ti)/(T0*Ti)(把周期T同样的天体合为一个天体).则与第0个天体角度相差180度的时间为ti = (T0*Ti)/((T0-Ti)*2). 那么

【数论Day4】 数学 题解

题目:http://www.cnblogs.com/ljc20020730/p/7041033.html 1.离散函数(function.pas/c/cpp) 观察右图,图像必须符合任意两点都在直线的下方.故三条直线中只有相邻两顶点之间的连线的斜率最大.故得出一个规律:最大斜率的直线一定由x坐标相邻的两点确定,即Xi-Xi-1最大的点对. O(n)枚举,通过本题. var n,i,ans1,ans2,maxk:longint; a:array[1..200000]of longint; begi

两数的最大公约数、最小公倍数

几个整数,公有的约数,叫做这几个数的公约数:其中最大的一个,叫做这几个数的最大公约数.例如:12.16的公约数有±1.±2.±4,其中最大的一个是4,4是12与16的最大公约数,一般记为(12,16) = 4.12.15.18的最大公约数是3,记为(12,15,18) = 3.    几个自然数公有的倍数,叫做这几个数的公倍数,其中最小的一个自然数,叫做这几个数的最小公倍数.例如:4的倍数有±4.±8.±12.±16,--,6的倍数有±6.±12.±18.±24,--,4和6的公倍数有±12.±

12--c完数/最大公约数/最小公倍数/素数/回文数

完数/最大公约数/最小公倍数/素数/回文数 2015-04-08 10:33 296人阅读 评论(0) 收藏 举报  分类: C/C++(60)  哈尔滨工业大学(8)  版权声明:本文为博主原创文章,未经博主允许不得转载. 1.一个正整数的因子是所有可以整除它的正整数.而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数.例如6=1+2+3(6的因子是1,2,3). [cpp] view plain copy #include <stdio.h> #include <math.h

模m的剩余类里的一切数与m的最大公约数相等

[模m的剩余类里的一切数与m的最大公约数相等] 设剩余类里的任意两元素,a.b.则: a=mq1+r1, b= mq2+r1. 根据上式可得,(a,m)=(m,r1), (b,m)=(m,r2).可推得(a,m)=(b,m). 所以模m的剩余类里的一切数与m的最大公约数相等.

小学奥数 最大公约数与最小公倍数

依然要用到均值不等式的知识,证明在这里:http://www.cnblogs.com/xtx1999/p/4913067.html 因为知道了两个数的最大公约数和最小公倍数,于是就知道了两个数的乘积.根据均值不等式,两个数和一定两数和一定,它们两个越接近乘积越大.所以乘积一定时,它们越接近和就越小所以枚举即可. #include<iostream> #include<cstdio> using namespace std; int gcd,lcm,a,b,tot,ans=10000

两数最大公约数 (递归算法)

//求取两数最大公约数(gcd):gcd(m,n)=gcd(n,m%n) //递归方法实现,如下: #include "stdafx.h" #include <iostream> using namespace std; int gcd(int a, int b) //递归函数 { int r; r = a%b; if (r == 0) return b; else return gcd(b, r); } int main() { int a, b; cout <&l

如何求两数的最大公约数

一: 更相减损 //熟知的辗转相除法变形 main() { int a,b; scanf("%d %d",&a,&b); while(a!=b) { if(a>b) a-=b; else b-=a; } printf("%d",a); } 二: 辗转相除 //一般用递归描述算法 gcd(m,n)与gcd(n,m mod n)相同 为什么? gcd(m,0)=m 为什么? 两数不需比较大小也行 为什么 ? main() { int a,b,r,t

算法怎么就这么难?----使用欧几里得算法求两数的最大公约数

本人菜鸟一枚,上午在看书的时候突然看到了求最大公约数的一个例题,突然就想到以前好像看过一个欧几里得算法,故又上网仔细找了一下欧几里得算法的原理.可能是本人时间长没看算法,脑子都生锈了. 看了几个讲解欧几里得算法的文章,大都只给公式,然后说了一大堆因为....在我还没看懂的时候,突然来了个所以...然后公式就这样推出来的.⊙﹏⊙b汗! 经过我这令人捉急的小脑袋转了半天,最后有了点眉目,所以拿出来和大家分享一下! 1.首先说一下:欧几里得算法是求两个数的最大公约数的,你可能会问:什么是最大公约数?