最大公约数

ZZULIOJ 1062: 最大公约数

家住魔仙堡 提交于 2020-01-04 02:34:54
题目描述 输入两个不大于10的9次方的正整数,输出其最大公约数。 输入 输入两个正整数m和n,数据之间用空格隔开。 输出 输出一个整数,表示m和n的最大公约数。 样例输入 4 6 样例输出 2 提示 请查阅欧几里得定理及辗转相处法。 int main(){ int m,n,r; scanf("%d %d",&m,&n); while(m%n!=0){ r=m%n; m=n; n=r; } printf("%d",n); return 0; } tips: 1.辗转相除法 2.最小公倍数:m*n/gcd(m,n); 来源: CSDN 作者: vivi_cin 链接: https://blog.csdn.net/vivi_cin/article/details/103818522

hdu 2669 Romantic 扩展欧几里德

大城市里の小女人 提交于 2019-12-30 04:41:00
利用扩展欧几里德算法可以解方程ax+by=c. 当使用扩展欧几里德算法时,当x+b时,y-a。 欧几里德算法 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a = kb +r 因此d也是(a,b)的公约数 因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证 。 其算法:(a为任意非负整数,b为任意正整数) /* * hdu2669.c * * Created on: 2011-9-13 * Author: bjfuwangzhu */#include<stdio.h>int x, y;int extend_gcd(int a, int b) { if (b == 0) { x = 1, y = 0; return a; } int d = extend_gcd(b, a % b); int tx = x; x = y, y = tx - a / b * y; return d;}int main() {#ifndef ONLINE_JUDGE freopen("data

HDU 1019[Least Common Multiple] GCD

廉价感情. 提交于 2019-12-29 07:44:15
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1019 题目大意:求n个数的最大公约数 关键思想:最大公倍数等于乘积除以最大公约数。LCM具有结合律和交换律 代码如下 //求最大公倍数。 #include <iostream> using namespace std; typedef long long ll; ll gcd(ll a,ll b){ return a%b==0?b:gcd(b,a%b); } ll lcm(ll a,ll b){ return a*b/gcd(a,b);//最大公倍数等于乘积除以最大公约数 } int main(){ int T,n; ll a,ans; cin>>T; while(T--){ ans=1; cin>>n; for(int i=0;i<n;i++){ cin>>a; ans=lcm(ans,a); } cout<<ans<<endl; } return 0; }    来源: https://www.cnblogs.com/G-M-WuJieMatrix/p/6420810.html

AcWing 872 最大公约数

故事扮演 提交于 2019-12-25 00:31:51
题目描述: 给定n对正整数ai,bi,请你求出每对数的最大公约数。 输入格式 第一行包含整数n。接下来n行,每行包含一个整数对ai,bi。 输出格式 输出共n行,每行输出一个整数对的最大公约数。 数据范围 1≤n≤10^5,1≤ai,bi≤2∗10^9 输入样例: 2 3 6 4 6 输出样例: 3 2 分析: 求gcd(a,b)一般使用欧几里得算法(辗转相除法),当然也可以采用其他办法比如更相减损术。 欧几里得算法的核心是gcd(a,b) = gcd(b,a%b)。已知c | a,c | b,则可以得到c | (xa +yb),又a % b = a - kb,令c = gcd(a,b),x=1,y=-k,就得到了c | (a - kb),即c | (a % b)。那么知道了c是b和a % b的公约数,如何证明c是最大公约数呢,很简单,加上b和a % b存在更大的公约数d,则d | (a % b + a / b * b),即d | a,如此d就是a和b的公约数了,这与c=gcd(a,b)是矛盾的,故c也是b和a % b的最大公约数。 #include <iostream> using namespace std; int gcd(int a,int b){ return b ? gcd(b,a % b) : a; } int main(){ int n,a,b; scanf("%d

最大公约数and最小公倍数

≡放荡痞女 提交于 2019-12-23 01:45:57
求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b即为两数的最大公约数 ③ 若c≠0,则a=b,b=c,再回去执行① 例如求27和15的最大公约数过程为: 27÷15 余12 15÷12余3 12÷3余0 因此,3即为最大公约数 # include <stdio.h> int f1 ( int a , int b ) { while ( a % b != 0 ) { int t = a % b ; a = b ; b = t ; } return b ; } int f2 ( int a , int b ) { return a * b / f1 ( a , b ) ; } int main ( ) { int a , b , c , t ; scanf ( "%d%d" , & a , & b ) ; printf ( "%d\n%d" , f1 ( a , b ) , f2 ( a , b ) ) ; return 0 ; } 来源: CSDN 作者: djl_l_ghh 链接: https://blog.csdn.net/djl_l_ghh/article/details/103657252

最大公因数与最小公倍数

你离开我真会死。 提交于 2019-12-23 00:57:51
求两个正整数 a,b 的最大公因数与最小公倍数。 两个数的最大公因数指的是 a,b 共有的约数中最大的一个。 两个数的最小公倍数指的是 a,b 共有的倍数中最小的一个。 输入格式: 在一行中给出两个数字 a,b (1<=a,b<=1,000,000,000) 输出格式: 在一行中以空格分隔输出 a,b 的最大公因数与最小公倍数。 输入样例: 6 9 输出样例: 3 18 提示: 建议使用 long long int 类型进行运算。 long long int 的占位符是 %lld # include "stdio.h" int main ( ) { long int a , b , t , m ; scanf ( "%lld%lld" , & a , & b ) ; m = a * b ; if ( b > a ) { t = a ; a = b ; b = t ; } while ( b != 0 ) { t = a % b ; a = b ; b = t ; } printf ( "%lld %lld\n" , a , m / a ) ; return 0 ; } 来源: CSDN 作者: smalldregs 链接: https://blog.csdn.net/smalldregs/article/details/103657280

最大公约数之和

放肆的年华 提交于 2019-12-20 01:44:22
Given the value of N, you will have to find the value of G. The meaning of G is given in the following code G=0; for(i=1;i<N;i++) for(j=i+1;j<=N;j++) G+=gcd(i,j); #include<iostream> #include<cstdio> using namespace std; #define maxn 1000005 #define LL __int64 int phi[maxn]; LL ans[maxn]; void Init() { int i,j,k; for(i=2;i<maxn;i++) phi[i]=i; for(i=2;i<maxn;i++) if(phi[i]==i) for(j=i;j<maxn;j+=i) phi[j]=phi[j]/i*(i-1); for(i=2;i<maxn;i++) ans[i]=phi[i]; for(i=2;i<=1000;i++) { ans[i*i]+=phi[i]*i; for(j=i*i+i,k=i+1;j<maxn;j+=i,k++) ans[j]+=i*phi[k]+k*phi[i]; } for(i=1;i<maxn;i++) ans[i]+=ans[i-1]

编写两个函数,分别求两个正整数的最大公约数和最小公倍数;

时光总嘲笑我的痴心妄想 提交于 2019-12-17 02:59:28
7.6编写两个函数,分别求两个正整数的最大公约数和最小公倍数; # include <stdio.h> int fun1 ( int m , int n ) { // 最大公约数函数 int t ; if ( m < n ) { //确保m为大数 t = m ; m = n ; n = t ; } while ( n != 0 ) { //辗转相除 ,找最大公约数 t = m % n ; m = n ; n = t ; } return m ; //此时n为0,返回公约数m } int fun2 ( int m , int n ) { //最小公倍数函数 int t ; t = m * n / fun1 ( m , n ) ; return t ; } int main ( ) { int m , n ; printf ( "请输入两个正整数:\n" ) ; scanf ( "%d%d" , & m , & n ) ; printf ( "%d和%d的最大公约数为:%d\n" , m , n , fun1 ( m , n ) ) ; printf ( "%d和%d的最小公约数为:%d" , m , n , fun2 ( m , n ) ) ; } 来源: CSDN 作者: Java_yubaobao 链接: https://blog.csdn.net/Java_yubaobao

Java重写《C经典100题》 --16

不羁的心 提交于 2019-12-16 15:49:58
【程序16】 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 1.程序分析:从小数开始向下求最大公约数,从大数向上求最小公倍数。。 2.程序源代码: 1 /*本文转自博客:www.cnblogs.com/java-100 2 【程序16】 3 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 4 程序分析:从小数开始向下求最大公约数,从大数向上求最小公倍数。 5 */ 6 7 public class Java16 { 8 9 public static void main(String[] args) { 10 System.out.print("请输入m,n两个正整数,中间以空格隔开:"); 11 Scanner scanner = new Scanner(System.in); 12 int m = scanner.nextInt(); 13 int n = scanner.nextInt(); 14 scanner.close(); 15 int greatestCommonDivisor = 0, leastCommonMultiple = 0; 16 int min = m < n ? m : n; 17 int max = m > n ? m : n; 18 System.out.println("m=" + m + ",n=" + n); 19

for循环的练习

白昼怎懂夜的黑 提交于 2019-12-16 14:32:28
1. for循环的练习 输入两个数值: 求两个数的最大公约数和最小公倍数. 最小公倍数=(num1*num2)/最大公约数 # 1.接收两个数字 num1 = int(input('Num1:')) num2 = int(input('Num2:')) # 2.找出两个数中最小的值 min_num = min(num1, num2) # 3.最大公约数的范围在1~min_num for i in range(1, min_num + 1): if num1 % i == 0 and num2 % i == 0: # 当循环结束的时候,gys中保存的就是最大的公约数 gys = i # 4.最小公倍数 lcm = int((num2 * num1)/gys) print('%s和%s的最大公约数是:%s' %(num1,num2,gys)) print('%s和%s的最小公倍数是:%s' %(num1,num2,lcm)) 来源: CSDN 作者: 小草卑微 链接: https://blog.csdn.net/yrx420909/article/details/103561682