最大公约数

C++ ! 最大公约数 !(大数)

匿名 (未验证) 提交于 2019-12-02 23:55:01
题目描述 从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数,用符号c(n,m)表示。 计算公式为:c(n,m)=n!/((n-m)!×m!) 现在你的任务是求出C(2n,1),C(2n,3),C(2n,5),…,C(2n,2n-1)的最大公约数。 解答要求 时间限制:5000ms, 内存限制:64MB 输入 输入只有一个整数n(1<n<=10000)。 输出 输出C(2n,1),C(2n,3),C(2n,5),…,C(2n,2n-1)的最大公约数。 样例 输入样例 1 3 输出样例 1 2 提示 范例中n=3,则C(2n,1),C(2n,3),C(2n,5),…,C(2n,2n-1)为6,20,6,则他们的最大公约数为2。 网上版本 * * 网上的版本 * * ``` c /** * 这道题直接按照组合的公式求解内存不够,所以需要利用辗转相减等价的思路求解。a,b的最大公约数,等价于a-b(a>b)与b的公约数 * 那么 C(2n,1),c(2n,3)...,c(2n,2n-1)的最大公约数 等价于 从c(2n,1)和c(2n,1)+c(2n,3)+..+c(2n,2n-1)(求和等于(2n)^(2n-1),奇偶项和相等,各等于总和的一半

最大公约数

匿名 (未验证) 提交于 2019-12-02 23:52:01
一、辗转相除法    inline int GCD(int x,int y) { int r=x%y; while(r) x=y,y=r,r=x%y; return y; }   原理证明 因为a=b+c,于是b,c的公约数也必然是a的约数,假设(b,c)=e, ((b,c)=e表示e为b和c的最大公约数)那么有elb+c,即ela, 根据"d是b,c的公约数"知道dle,, 又因为e也是a,b的公约数,eld,综上有e=d 可见(a,b)=(b,c)=d 二、二进制算法 可将x,y分为六种情况进行讨论: 若x=0或y=0:返回y或x; 若x<y:交换x,y; 若x为偶数且y为偶数:gcd(x/2,y/2); 若x为偶数且y为奇数:gcd(x/2,y); 若x为奇数且y为偶数:gcd(x,y/2); 若x为奇数且y为奇数:gcd(x-y,y); inline int gcd(int x,int y) { int n=0,m=0; while(!(x&1)) ++n,x>>=1; while(!(y&1)) ++m,y>>=1; n=min(n,m); while(1) { if(x<y) swap(x,y); if(!(x-=y)) return y<<n; while(!(x&1)) x>>=1; } } 三、最小公倍数  

求最大公因数的三种算法

匿名 (未验证) 提交于 2019-12-02 23:49:02
欧几里得算法 #include<iostream> using namespace std; int fun(int a, int b){ if (a >= b){ int r = a%b; if (r == 0) return b; else fun(b, r); } else fun(b, a); } int main() { int a, b; cout << "请输入两个整数" << endl; cin >> a>>b; int r = 1; r = fun(a, b); cout << a << "和" << b << "的最大公约数是:" << r << endl; }在这里插入代码片 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 连续整数检测法 #include<iostream> using namespace std; int fun2(int a, int b){ int c; if (a <= b) c = a; else c = b; for (c; c >= 1; c--) { if (a%c== 0 && b%c== 0) break; } return c; } int main() { int a, b; cout << "请输入两个整数" << endl; cin >>

算法:理解“扩展欧几里得算法”

匿名 (未验证) 提交于 2019-12-02 23:48:02
这个算法还是有点意思的,需要一些思考量和理解。 欧几里得算法没扩展之前,计算的两个数的最大公约数,比如计算144和24的最大公约数,计算的过程如下: 最开始:144 24 第一次:24 144 % 24 即 24 0 发现直接整数了, 说明24就是144的公约数 ,所以计算结果就是:24 如果用a,b来表示,变为一般形式的话: 给定两个数(a, b),现在想计算两者的最大公约数,那么可以那b来模a, 如果结果为0,那说明b就是两者的最大公约数 ,如果有余数,比如: 最开始:14 6 第一次:6 14 % 6 即6 2 第二次:2 6 % 2 即2 0 反过来看:2是2、6的最大公约数,而6不是6、14的最大公约数,但是K * 6 + 2能够得到14,且6能被2整除,说明2是14的公约数。 如果将欧几里得算法进行扩展,就是这样,比如: 144 24,我们知道两者的最大公约数是24,那么144x + 24y = 24,这个x、y分别是什么呢?显然是x = 0,y = 1;但如果是14x + 6y = 2呢?通过上面求最大公约数的过程,我们能够知道,最后一步的2x1 + 6y1 = 2是很容易的得到结果的, 但是怎么样从这个结果推回来,得到一开始的y呢? ――这个就是扩展欧几里得算法。 这样来理解: 14x + 6y 6x2 + (14 % 6)y2 2x1 + (6 % 2)y1

CF1203C Common Divisors

谁说胖子不能爱 提交于 2019-12-02 23:43:46
You are given an array a a consisting of n n integers. Your task is to say the number of such positive integers x x such that x x divides eachnumber from the array. In other words, you have to find the number of common divisors of all elements in the array. For example, if the array a a will be [ 2 , 4 , 6 , 2 , 10 ] [2,4,6,2,10], then 1 1 and 2 2 divide each number from the array (so the answer for this test is 2 2). Input The first line of the input contains one integer n n ( 1 ≤ n ≤ 4 ⋅ 10 5 1≤n≤4⋅105) — the number of elements in a a. The second line of the input contains n n integers a 1 ,

分数四则运算

匿名 (未验证) 提交于 2019-12-02 23:41:02
预备知识: 1、分数化简 第一种情况:如假分数17/2,最终需要化简成8 1/2;即a b/c的形式 其中a = 分子/分母; b = 分子%分母;c是分母 第二种情况:6/9,需要化简成2/3;即将分子分母同时除以 最大公约数 求最大公约数算法如下: /*a 和 b的最大公约数*/ int gcd ( int a , int b ) { if ( b == 0 ) return a ; else return gcd ( b , a % b ) ; 一、加法运算(正数与正数相加) /* 1、分数相加 2、约分 3、判断是否是假分数,化简 */ # include <stdio.h> int gcd ( int a , int b ) { if ( b == 0 ) return a ; else return gcd ( b , a % b ) ; } void addRationalNumber ( int up1 , int down1 , int up2 , int down2 , int * up , int * down ) { int temp ; * down = down1 * down2 ; * up = up1 * down2 + up2 * down1 ; temp = gcd ( * up , * down ) ; //temp保存最大公约数的值 /*约分

python常用算法(6)——贪心算法,欧几里得算法

夙愿已清 提交于 2019-12-02 15:13:01
1,贪心算法   贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的的时在某种意义上的局部最优解。   贪心算法并不保证会得到最优解,但是在某些问题上贪心算法的解就是最优解。要会判断一个问题能否用贪心算法来计算。贪心算法和其他算法比较有明显的区别,动态规划每次都是综合所有问题的子问题的解得到当前的最优解(全局最优解),而不是贪心地选择;回溯法是尝试选择一条路,如果选择错了的话可以“反悔”,也就是回过头来重新选择其他的试试。 1.1 找零问题   假设商店老板需要找零 n 元钱,钱币的面额有100元,50元,20元,5元,1元,如何找零使得所需钱币的数量最少?(注意:没有10元的面额)   那要是找376元零钱呢? 100*3+50*1+20*1+5*1+1*1=375   代码如下: # t表示商店有的零钱的面额 t = [100, 50, 20, 5, 1] # n 表示n元钱 def change(t, n): m = [0 for _ in range(len(t))] for i, money in enumerate(t): m[i] = n // money # 除法向下取整 n = n % money # 除法取余 return m, n print(change(t, 376)) # ([3,

求最大公约数和最小公倍数-----算法分析

一世执手 提交于 2019-12-02 10:59:47
最大公约数和最小公倍数 新手学习编程包括我在内(同为菜鸟),经常会遇到求最大公约数最小公倍数的问题,并且容易忘记,为了牢牢记住,现在我们谈论怎么用c语言解决它。 最大公约数 最大公约数通常有三种实现方法,这里体现其中两种。 1.辗转相除法: 具体的步骤就是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。最后的除数就是这两个数的最大公约数。 例如: 3 和 8 8 % 3 = 2 3 % 2 = 1 2 % 1 = 0 1即为最大公约 /////////////////辗转相除 # include <stdio.h> void GreatCommonDivisor ( int a , int b ) { while ( a != 0 || b != 0 ) { if ( a < b ) { c = a ; a = b ; b = c ; } a = a % b ; if ( a == 0 ) { break ; } } printf ( "%d\n" , b ) ; } int main ( ) { GreatCommonDivisor ( 1 , 3 ) ; GreatCommonDivisor ( 5 , 5 ) ; GreatCommonDivisor ( 9 , 18 ) ;

Java代码

老子叫甜甜 提交于 2019-12-02 10:43:57
** 求最大公约数和 最小公倍数 ** package homework; import java.util.Scanner; public class 最大公约数和最大公倍数 { public static int GCD(int a,int b){ int tmp=1; for(int i=0;;i++){ tmp=a%b; if(tmp==0){ break; } a=b; b=tmp; } return b; } public static int LCM(int a,int b){ int temp=GCD(a,b); return (a*b)/temp; } public static void main(String[] args) { int m,n; Scanner reader=new Scanner(System.in); System.out.println("enter m and n"); m=reader.nextInt(); n=reader.nextInt(); int gcd,lcm; //gcd 最大公约数,LCM最小公倍数 gcd=GCD(m,n); lcm=LCM(m,n); System.out.print("最大公因数:"); System.out.println(gcd); System.out.print("最小公倍数:");

《Python编程从0到1》笔记3——欧几里得算法

巧了我就是萌 提交于 2019-12-02 08:24:46
本节以欧几里得算法(这是人类历史上最早记载的算法)为示例,向读者展示注释、文档字符串(docstring)、变量、循环、递归、缩进以及函数定义等Python语法要素。 欧几里得算法:“在数学中,辗转相除法,又称欧几里得算法(Euclidean algorithm),是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。”---《维基百科.辗转相除法》 在实际操作中,可以使用带余数除法替代减法以减少步骤。下面是使用流程图绘制的算法示意图: 图 1.2 欧几里得算法流程图 在程序设计实践中,很少针对简单的程序绘制流程图。因为对于熟练的程序设计者来说,代码本身足以清晰地说明程序的执行流程。流程图往往用于描述大的软件系统的工作原理,或者用来辅助不够结构化的语言(如汇编语言)。 根据前述算法描述,计算252和105的最大公约数的计算步骤如下: 1.252除以105余42,问题转为求105和42的最大公约数; 2.105除以42余21,问题转为求42和21的最大公约数; 3.42除以21可以除尽,达到算法终点; 4.结论:252和105的最大公约数为21。 代码 1