首页 > 代码库 > 公约数算法
公约数算法
/*对于已知的两个自然数m, n,假设m>n计算m除以n,将得到的余数记做r如果r=0,则此时的n为求得的最大公约数。否则,将n的值保存在m中,将r的值保存在n中,重复执行下去。*///欧几里得->辗转相除法#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <iostream>#include <iomanip>#include <algorithm>using namespace std;int gcd(int a, int b){ int m, n, r; //m大 n小 if(a>b) { m=a; n=b; } else { m=b; n=a; } r=m%n; while(r!=0) { m=n; n=r; r=m%n; } return n;}int main(){ int n, m, dd; while(scanf("%d %d", &n, &m)!=EOF) { dd=gcd(n, m); printf("%d\n", dd); } return 0;}
/*欧几里得算法的执行效率很高,但是如果参与运算的数据非常大的话就暴露了缺点。计算机中的整数最多是64位,如果低于64位,取模运算比较简单,直接用%就行。但是如果对于计算两个超过64位的整数的模,gcd算法效率十分低,这是便有了Stein算法。*/#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <iostream>#include <iomanip>#include <algorithm>using namespace std;int Stein(int a, int b){ int m, n, r; if(a>b) { m=a; n=b; } else { m=b; n=a; } if(n==0) return m; if(m%2==0 && n%2==0 ) { return 2*Stein(m/2, n/2); } if(m%2==0) return Stein(m/2, n); if(n%2==0) return Stein(m, n/2); return Stein((m+n)/2, (m-n)/2);}int main(){ int n, m, dd; while(scanf("%d %d", &n, &m)!=EOF) { dd=Stein(n, m); printf("%d\n", dd); } return 0;}
公约数算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。