最大公约数

Java-公约公倍

喜你入骨 提交于 2020-01-30 00:09:57
题目: 如果两个数很大,怎样求最大公约数,最小公倍数? 如果是n个数呢?比如1000个数的最小公倍数 分析: 求a和b的最大公约数——辗转相除法(又叫欧几里得定理)。即找到一个数,能对a,b都除尽。对于这个定理:a,b的最大公约数,等于b,a-b(a大)的最大公约数,等于b,a-b-b...(如果够减就可一直减下去)的最大公约数。也就是说求b,a%b 和求a,b是一样的。也即欧几里得定理内容为gcd(a,b)=gcd(b,a%b)。 源代码: 结果: 来源: https://www.cnblogs.com/Cocoon-z/p/12241866.html

第七次作业

拈花ヽ惹草 提交于 2020-01-29 21:10:25
1. 定义一个判断素数的函数isprime(int n) ,利用该函数输出1000 以内的所有素数,每行10 个,最后输出一共有多少个素数。(每列对齐) #include<stdio.h> int isprime(int x); int main() { int num=0,n; for(n=2;n<=1000;n++) { if(isprime(n)) { printf("%4d ",n); num++; if(num%10==0) { printf("\n"); } } } printf("一共%d个数\n",num); return 0; } int isprime(int x) { int i,flag=1; for(i=2;i<=x-1;i++) { if(x%i==0) { flag=0; } } if(flag==1) { return 1; } else { return 0; } } 2. 求两个正整数的最大公约数和最小公倍数。用一个函数gcd(int a,int b) 求最大公约数, 另一个函数lcm(int a,int b) 根据求出的最大公约数求最小公倍数。 #include<stdio.h> #include<stdlib.h> int gcd(int a,int b); int lcm(int m,int n); int main() { int x,y

第七次作业

妖精的绣舞 提交于 2020-01-28 22:54:31
一、 实验内容 1. 定义一个判断素数的函数isprime(int n),利用该函数输出1000以内的所有素数,每行10个,最后输出一共有多少个素数。(每列对齐) #include<stdio.h> #include<math.h> int isprime(int n); int isprime(int n) { int i,flag=1; for(i=2;i<=n-1;i++) { if(n%i==0) { flag=0; } } if(flag==1) { return 1; } else { return 0; } } int main() { int a,b=0; for(a=2;a<=1000;a++) { if(isprime(a)) { printf("% 4d ",a); b=b+1; if(b%10==0) { printf("\n"); } } } printf("共有%d个数\n",b); return 0; } 2.求两个正整数的最大公约数和最小公倍数。用一个函数gcd(int a,int b)求最大公约数,另一个函数lcm(int a,int b)根据求出的最大公约数求最小公倍数。 #include<stdio.h> #include<stdlib.h> int gcd(int a,int b); int lcm(int m,int n); int

Python_2_daythree2_CyclicStructure

為{幸葍}努か 提交于 2020-01-28 13:54:54
"""Function_1: for-in循环用for循环实现1~100之间的奇数求和Time: 2020.1.27Author: YaoXie"""# sumup = 0# for x in range(2, 101, 2):# print(x)# sumup += x# print(sumup)"""Function_2: while循环输入一个正整数判断是不是素数。质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。Time: 2020.1.27Author: YaoXie"""# while True:# a = int(input('Enter a positive integer :\n'))# b = int(a ** 0.5)# is_prime = True# if a <= 1:# print("素数是一个大于1的自然数,请重新输入!")# if a == 2:# print("%d is a prime" % a)# else:# for i in range(2, b + 1):# if a % i == 0:# is_prime = False# print("%d is not a prime" % a)# break# if is_prime:# print("%d is a prime" % a)#

ACM.GCD与LCM

家住魔仙堡 提交于 2020-01-25 11:52:01
欧几里得算法 取模运算的运算规则 (a + b) % p = (a % p + b % p) % p (a - b) % p = (a % p - b % p) % p (a * b) % p = (a % p * b % p) % p a ^ b % p = ((a % p)^b) % p 又名辗转相除法 代码实现过程 1非递归写法 int gcd ( int a , int b ) { int r = a % b ; while ( r ) { a = b ; b = r ; r = a % b ; } return b ; } 2递归写法 int gcd ( int a , int b ) { return b ? gcd ( b , a % b ) : a; } 最小公倍数lcm(a,b)=a b/gcd(a,b) 最大公约数和最小公倍数的一些性质 gcd(a , b) = gcd(b , a-b) gcd(ma , mb) = m gcd(a , b), m为一个自然数 gcd(a+mb , b) = gcd(a , b) m=gcd(a , b) 则gcd(a/m,b/m)=gcd(a,b)/m gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c)) lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a,

辗转相除法求最大公约数和最小公倍数分析

孤街醉人 提交于 2020-01-24 10:28:46
求最大公约数和最小公倍数 程序分析: (1)最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数; (2)求最大公约数用辗转相除法(又名欧几里德算法) 辗转相除法: #include<stdio.h> int main() { int a,b,c; int raw_a,raw_b; scanf("%d %d",&a,&b); raw_a=a;raw_b=b; c=a%b; while (c!=0) { a=b;b=c; c=a%b; } printf("a与b的最大公约数是:%d\n",b); printf("a与b的最小公倍数是:%d\n",raw_a*raw_b/b); return 0; } 12 56 a与b的最大公约数是:4 a与b的最小公倍数是:168 具体步骤: #include<stdio.h> int main() { int a,b,c; int raw_a,raw_b; scanf("%d %d",&a,&b); raw_a=a;raw_b=b; c=a%b; printf("%d = %d * %d + %d\n",a,a/b,b,a%b); while (c!=0) { a=b;b=c; c=a%b; printf("%d = %d * %d + %d\n",a,a/b,b,a%b); } printf("\n"); printf(

JAVA经典算法(六)

陌路散爱 提交于 2020-01-24 03:46:10
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 求最大公约数用的是欧几里得算法(辗转相除法) 百度百科里都有解释,这是我复制粘贴过来的哈哈 假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里德算法,是这样进行的: 1997 / 615 = 3 (余 152) 615 / 152 = 4(余7) 152 / 7 = 21(余5) 7 / 5 = 1 (余2) 5 / 2 = 2 (余1) 2 / 1 = 2 (余0) 至此,最大公约数为1 以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。 两个数的最小公倍数:两个数的积除以这两个数的最大公约数。 根据上述描述,分为以下三步思路: 1、首先给出m,n两个整数,先求出最大公约数,则最小公倍数就等于(m*n)/最大公约数 2、先判断m,n的大小,利用交换的思想让大的数在左边 3、如果m%n==0则表示余数为0,除数n则为最大公约数,否则的话继续让它递归,n作为新的被除数,m%n得到的余数作为除数去辗转相除,最后直到余数为0,除数则为最大公约数,最小公倍数自然也就迎刃而解了。 代码如下所示: package cn.ls.lanqiao; import java.util.Scanner; public class Test6 {

递归函数求最大公约数

眉间皱痕 提交于 2020-01-23 16:46:22
#include<stdio.h> int func(int min,int max) { if(!(max%min)) { return min; } return func(max % min,min); } int main() { int min=0,max=0; printf("请输入两个数子"); scanf("%d%d",&min,&max); printf("最大公约数是%d\n",func(min,max)); return 0; } 来源: CSDN 作者: wipeout 链接: https://blog.csdn.net/wipeout/article/details/104076219

ybt1207 最大公约数问题 递归经典例题

大憨熊 提交于 2020-01-23 00:16:23
ybt1207 最大公约数问题 递归典例 (选它只是因为太典型,不是因为懒得做难题故意放水) 【题目描述】 给定两个正整数,求它们的最大公约数。 【输入】 输入一行,包含两个正整数(<1,000,000,000)。 【输出】 输出一个正整数,即这两个正整数的最大公约数。 【输入样例】 6 9 【输出样例】 3 【题解】 求最大公约数明明可以两个数同时试除所有小于等于它们的算术平方根的质数,然后把整除的数累乘,得到结果,但是这种算法不光写起来很麻烦,而且的复杂度是: \[ O(\sqrt{n}) \] 很显然,辗转相除是一个更好的方案,辗转相除法,这种算法是用大的数除以小的数(舍掉余数),然后所得的商作为较小的数,之前较小的数作为较大的数,进行同样的运算,直到较小的数为0,这时较大的数便就是一开始两数的最大公约数。 这种算法的证明却没有算法一样简单(其实我不会),如果哪天我有想法(卡题了失去梦想),就对算法进行证明 这种算法的复杂度为: \[ O(log(n)) \] 非常的优秀,堪称递归界的一股清流。 接下来看看代码(故意加很多回车显得代码很长) #include<iostream> using namespace std; int a; int b; int f(int a,int b)//算法主体 { if(b==0) { return a; } return f(b,a%b)

求最大公约数——辗转相除法

蓝咒 提交于 2020-01-21 22:25:09
求最大公约数——辗转相除法 设求a和b的最大公约数c 则可看做边长分别为a和b的矩形,可恰好被边长为c的正方形无缝隙填满 方法:不断地用长边除以短边取余数,直到长边与短边相等,即为所求正方形 solve(a,b)=solve(b,a%b)=…… ……=solve(c,0) 代码: int solve ( int a , int b ) { if ( b == 0 ) return a ; else return solve ( b , a % b ) ; } 例题: 求线段上格点的个数 给定平面上的两个格点P1=(x1,y1)P2=(x2,y2),线段P1P2上,除P1和P2以外一共有几个点。 示例: P1=(3,9) P2=(7,1) 则求出7-3和9-1的最小公倍数为solve(8,4) 小矩形的边长为分别为8/solve(8,4)和4/solve(8,4) # include "stdio.h" # include "stdlib.h" int x1 , y1 ; int x2 , y2 ; int max ( int a , int b ) { return a > b ? a : b ; } int min ( int a , int b ) { return a > b ? b : a ; } int solve ( int a , int b ) { if ( b =