若给定两个正整数m和n,试写出求他们的最大公因子(既能够同时整除m和n的最大整数)的算法——欧几里德算
代码示例:
private void getMaxFactor(int m, int n){ System.out.printf("%d和%d的最大公因子为", m,n); int r = m%n; while(r>0){ m = n; n = r; r = m%n; } System.out.printf("%d", n); }
Private Sub Command1_Click()
Dim A As Integer
Dim B As Integer
Dim maxv As Integer
Dim minv As Integer
A = Val(InputBox("输入A"))
B = Val(InputBox("输入B"))
maxv = IIf(A > B, A, B)
minv = IIf(A < B, A, B)
Dim r As Integer
Do
r = maxv Mod minv
maxv = minv
minv = r
Loop While (r 0)
MsgBox "公约数" & maxv
End Sub
开放分类: 数学、最大公约数
辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。它是已知最古老的算法, 其可追溯至前300年。它首次出现于欧几里德的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。它并不需要把二数作质因子分解。
证明:
设两数为a、b(b<a),求它们最大公约数(a、b)的步骤如下:用b除a,得a=bq�1+r�1(0≤r�1<b)。若r�1=0,则(a,b)=b;若r�1≠0,则再用r�1除b,得b=r�1q�2+r�2(0≤r�2<r�1)。若r�2=0,则(a,b)=r�1,若r�2≠0,则继续用r�2除r�1,……如此下去,直到能整除为止。其最后一个非零余数即为(a,b)。
[编辑] 算法
辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:
1. 若 r 是 a ÷ b 的余数, 则
gcd(a,b) = gcd(b,r)
2. a 和其倍数之最大公因子为 a。
另一种写法是:
1. a ÷ b,令r为所得余数(0≤r<b)
若 r = 0,算法结束;b 即为答案。
2. 互换:置 a←b,b←r,并返回第一步。
[编辑] 虚拟码
这个算法可以用递归写成如下:
function gcd(a, b) {
if a mod b<>0
return gcd(b, a mod b);
else
return a;
}
或纯使用循环:
function gcd(a, b) {
define r as integer;
while b ≠ 0 {
r := a mod b;
a := b;
b := r;
}
return a;
}
其中“a mod b”是指取 a ÷ b 的余数。
例如,123456 和 7890 的最大公因子是 6, 这可由下列步骤看出:
a b a mod b
123456 7890 5106
7890 5106 2784
5106 2784 2322
2784 2322 462
2322 462 12
462 12 6
12 6 0
只要可计算余数都可用辗转相除法来求最大公因子。这包括多项式、复整数及所有欧几里德定义域(Euclidean domain)。
辗转相除法的运算速度为 O(n2),其中 n 为输入数值的位数。
辗转相除法
辗转相除法
辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。它是已知最古老的算法, 其可追溯至3000年前。它首次出现于欧几里德的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。它并不需要把二数作质因子分解。
证明:
设两数为a、b(b<a),求它们最大公约数(a、b)的步骤如下:用b除a,得a=bq......r 1(0≤r)。若r1=0,则(a,b)=b;若r1≠0,则再用r1除b,得b=r1q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止。其最后一个非零余数即为(a,b)。
[编辑] 算法
辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:
1. 若 r 是 a ÷ b 的余数, 则
gcd(a,b) = gcd(b,r)
2. a 和其倍数之最大公因子为 a。
另一种写法是:
1. a ÷ b,令r为所得余数(0≤r<b)
若 r = 0,算法结束;b 即为答案。
2. 互换:置 a←b,b←r,并返回第一步。
输入2 个正整数m和n(1<=m,n<=500),统计并输出m 和n之间的素数的个数...
修改如下:include <stdio.h> include <math.h> int prime(int n){\/\/判断n是否是素数,若是素数则返回1,否则返回0 int i,k;if(n<2)return 0;k=sqrt(n);for(i=2;i<=k;++i){ if(n%i==0)return 0;} return 1;} void main(){ int m,n,c,sum,count;int prime(int );print...
VC编写程序:输入两个正整数m和n(m>=1,n<=1000),输出m~n之间的所有水仙花...
\/ low = 1 high = 9999 1是水仙花数。1的各位数字之和与其自身相等。2的各位数字之和与其自身相等。3的各位数字之和与其自身相等。4的各位数字之和与其自身相等。5的各位数字之和与其自身相等。6的各位数字之和与其自身相等。7的各位数字之和与其自身相等。8的各位数字之和与其自身相等。9的各位数字...
输入两个正整数m和n,输出它们的最小公倍数和最大公约数。
include<stdio.h> int main(){ int a,b,num1,num2,temp;printf("please input two number:\\n");scanf("%d%d",&num1,&num2);if(num1<num2){ temp = num1;num1 = num2;num2 = temp;} a = num1;b = num2;while(b!=0){ temp = a%b;a=b;b=temp;} printf("gong...
使用函数计算素数个数并求和:输入两个正整数m和n(1≤m,n≤500),要求...
import java.util.*;public class Main{ public static void main(String[]args){ Scanner sc=new Scanner(System.in);int a=sc.nextInt();\/\/m int b=sc.nextInt();\/\/n ArrayList<Integer>list=new ArrayList<Integer>();\/\/定义一个list存放素数 while(a<=b){ \/\/如果a为素数,将其放入...
输入两个正整数m和n(m<n),求m到n之间(包括m和n)所有素数的和,我写的...
这是我写的,已经编译通过,简明易懂,希望对你有帮助。include<stdio.h> include<stdlib.h> int main(void){ int i,j,k=0,m,n;printf("please input two numbers:");scanf("%d,%d",&m,&n);while(m>n || m<=1) \/\/这里是判断语句 如果输入的m小于n或m小于2的话 就结束 { ret...
用c++编写程序:输入两个正整数m和n,求其最大公约数
c++也可以使用scanf和printf来输入输出,并且比较不易出错,最大公约数使用欧几里德辗转相除法伪代码如下:include<iostream>#include<stdlib.h>using namespace std;int main(){ int m,n,m_cup,n_cup,res; cin>>m>>n; if(m > 0 && n > 0) { m_cup=m; n_cup=n; res=m_cup...
c语言程序题,输入两个正整数m和n,求其最大公约数和最小公倍数。
输入两个正整数m和n,求其最大公约数和最小公倍数,可以参考下面的代码:include <stdio.h> void main (){ int m, n, p, q;printf ("请输入整数m,n的值:\\n");scanf ("%d, %d", &m, &n);p=m*n;while (n!=0){ q=m%n;m=n;n=q; \/\/这段是求最大公约数的算法 } ...
输入两个正整数m和n,求其最小公倍数 C语言程序设计
m == 0) return n;for(t = n;t <= n * m;t++) {if(t % m == 0 && t % n == 0)return t;}return m * n; \/\/ 永远得不到执行。}int main() {int m,n;while(scanf("%d%d",&m,&n) == 2) {printf("%d, %d 最大公约数为 : %d\\n",m,n,MaxFactor(m,n)...
输入两个正整数m和n,统计并输出两数之间的素数的个数以及这些素数的和...
include<math.h> int prime(int n){int i;for(i=2;i<=sqrt(n);i++)if(n%i==0)return 0;return n>1;} int main(){int m,n,i,k=0,s=0;scanf("%d%d",&m,&n);for(i=m;i<=n;i++)if(prime(i)){ printf("%8d",i);k++;s+=i;} printf("\\n共有%d个素数,总和...
输入2个正整数m 和n,输出m到n间的各对孪生素数i和j(m<=i<j<=n)。
include<stdio.h>#include<math.h>int prime(int k){ int j; double m; int s=k>1; m=sqrt(k); for(j=2; j<=m; j++) if(k%j==0) { s=0; break; } if(s) { m=sqrt(k+2); for(j=2; j<=m; j++) if((k+2)%j==0) { s ...
仝兰宜妥: 辗转相除法 开放分类: 数学、最大公约数 辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法.它是已知最古老的算法, 其可追溯至前300年.它首次出现于欧几里德的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》.它并不需要把二数作质因子分解. 证明: 设两数为a、b(b
喀喇沁左翼蒙古族自治县15585754995: 输入两个正整数m和n,求其最小公倍数? - ?
仝兰宜妥:[答案] 如果m和n的最大公因数是1,则m和n最小公倍数=m*n=mn. 如果m和n的最大公因数是a,则m和n最小公倍数=m*n÷a=mn/a. 如果m是n的倍数,则m和n最小公倍数为m. 如果n是m的倍数,则m和n最小公倍数为n.
喀喇沁左翼蒙古族自治县15585754995: 设计一个C程序解决这个题:输入两个正整数m和n,求其最大公约数和最小公倍数.写出完整的程序 - ?
仝兰宜妥:[答案] #include void main() { int a,b,m,n,p,t; printf("请按顺序输入a和b\n"); scanf("%d,%d",&a,&b); p=a*b; do {m=a%b;t=b;a=b;b=m; } while(m!=0); n=p/t; printf("a和b的最大公约数是%d\n最小公倍数是%d\n",t,n); }...
喀喇沁左翼蒙古族自治县15585754995: 输入两个正整数m和n,求它们的最大公约数和最小公倍数.(习题6.1) - ?
仝兰宜妥:[答案] 输入两个正整数m和n,求其最大公约数和最小公倍数.用辗转相除法求最大公约数 算法描述:m对n求余为a,若a不等于0 则 m 0) { m_cup = m; n_cup = n; res = m_cup % n_cup; while (res != 0) { m_cup = n_cup; n_cup = re...
喀喇沁左翼蒙古族自治县15585754995: 实验四 循环结构练习 1.编写一个C程序,指定两个正整数m和n,求出它们的最大公约数和最小公倍实验四 循环结构练习1.编写一个C程序,指定两个正整数... - ?
仝兰宜妥:[答案] 知道了
喀喇沁左翼蒙古族自治县15585754995: 欧几里德算法(若给定两个正整数m和n,试写出求它们的最大公因子的算法)的编程实现. - ?
仝兰宜妥: 代码示例: private void getMaxFactor(int m, int n){ System.out.printf("%d和%d的最大公因子为", m,n); int r = m%n; while(r>0){ m = n; n = r; r = m%n; } System.out.printf("%d", n); }
喀喇沁左翼蒙古族自治县15585754995: 任意输入两个正整数m和n,求m!+n!的值.c语言怎么写 - ?
仝兰宜妥: 考虑Int最大存储到16的阶乘, 再大就会导致数据溢出. 所以可以用double来存放阶乘的结果. 楼上:古风的程序,fun函数定义成double,却又定义了int的y来存储阶乘结果... 无语.. #include __int64 fun(int a) { if(a<=1) return 1; else return a*fun(a-1); } int main() { __int64 sum=0; int m,n; scanf("%d%d",&m,&n); sum=fun(m)+fun(n); printf("结果为:%I64d\n",sum); return 0; }
喀喇沁左翼蒙古族自治县15585754995: 试设计求两个正整数m,n的最大公约数的程序. - ?
仝兰宜妥:[答案] 用辗转相除法设计程序如下: Input“m=”;m Input“n=”;n If m MOD n=n then n=x end if r=m MOD n while r<>0 r=m MOD n m=n n=r wend print m end
喀喇沁左翼蒙古族自治县15585754995: 扩展欧几里得算法 - ?
仝兰宜妥: //欧几米德算法 //算法描述:给定两个正整数m和n,求他们的最大公因子. //1.[求余数]用m除以n并令r为所得余数 //2.[余数为0]若r=0,则算法结束,n即为所求答案 //3.[互换]置m←n,n←r,并返回步骤1. #include <cstdlib> #include <iostream> ...
喀喇沁左翼蒙古族自治县15585754995: C语言 输入两个正整数m和n,求他们的最大公约数和最小公倍数.?
仝兰宜妥: #include<stdio.h> #include<math.h> int main(void) { int n,m,i,j,t; scanf("%d%d",&n,&m); i = m > n ? m : n; j = m > n ? n : m; while(j) { t = i%j; i = j; j = t; } printf("\n%d--%d",i,m*n/i); return 0; } 请采纳,谢谢!