求最大公约数和最小公倍数。输入两个正整数m和n(m<=1000,n<=1000),求其最大公约数和最小公倍数。试编写相应程序。
#include<stdio.h>
int main(){
int i,m,n,max,min,upper,lower;
//循环变量:i:两数:m、n;最大公约数:max;最小公倍数:min;m、n中的较大者、较小者:upper、lower
printf("input two numbers: ");
scanf("%d%d",&m,&n);
if(m>0&&m<=1000&&n>0&&n<=1000){
upper = m>n?m:n; //使用三目运算 找到两数中的最大最小值
lower = m<n?m:n;
//最大公约数不超过两数的最小者,且大于等于1
for(i=lower;i>=1;i--){ // 可以换成 从1000到1
//从lower开始找最大公约数,如果两数对 i 求模皆为0,则为最大公约数
if(m%i==0 && n%i==0){
max = i;
break;
}
}
//最小公倍数至少是两数中的最大者,且一定是最大者的倍数,同时不超过两者的乘积
//在此条件下只需要找到最小数的倍数即可
for(i=upper;i<=m*n;i+=upper){ //可以换成 1到 m*n
if(i%lower==0){
min = i;
break;
}
}
printf("greatest common divisor is: %d, least common multiple is: %d\n",max,min);
}else{
printf("invalid value\n");
}
return 0;
}
2.辗转相除法 #include<stdio.h>
/*
辗转相除法:
1.如果b==0,计算结束,a为最大公约数;
2.否则,计算a%b的结果c,然后更新变量,让a=b,b=c;
3.回到第一步
注:若输入为两个数m、n,则最大公约数*最小公倍数 == m*n
*/
int main(){
int m,n,a,b,c;
//m、n为输入;a、b暂存m、n;c为a%b的结果
printf("input two numbers: ");
scanf("%d%d",&m,&n);
a=m; //给a、b赋值计算最大公约数,m、n保留计算最小公倍数
b=n;
//核心思想是:“不再有剩下的”
while(b!=0){ //1.如果b==0,计算结束,a为最大公约数;
c = a%b; //2.否则,计算a%b的结果c
a = b; //然后更新变量,让a=b,b=c;
b = c;
}
printf("gcd = %d\n,lcm = %d\n",a,m*n/a);//计算结束,a为最大公约数;最大公约数*最小公倍数 == m*n
return 0;
}
3.更相损减术 #include<stdio.h>
/*
更相损减术:
1.若a>b,a=a-b;若a<b,b=b-a
2.若a==b,则a为两数的最大公约数
3.若a!=b,返回1.
*/
int main(){
int m,n,a,b;
printf("input two numbers: ");
scanf("%d%d",&m,&n);
a=m; //给a、b赋值计算最大公约数,m、n保留计算最小公倍数
b=n;
while(a!=b){
if(a>b) a=a-b;
else b=b-a;
}
printf("gcd = %d\nlcm = %d\n",a,m*n/a);
return 0;
}
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int m = scanner.nextInt(); int n = scanner.nextInt(); int p = n * m; // 保证 m > n if (n > m) { int t = m; m = n; n = t; } int result = m % n; while (result != 0) { m = n; n = result; result = m % n; } System.out.println("最大公约数是:" + n); System.out.println("最小公倍数是:" + p / n); }
#include <stdio.h> int main (void) { int m, n, p, tmp; printf ("Please type in two number:\n"); scanf ("%i %i", &m, &n); //输入两个数,分别放入m, n p=m*n; //先把两数的积算出来,后面m和n的值会有变 while (n!=0){ tmp=m%n; m=n; n=tmp; //这段是求最大公约数的算法 } printf ("The GCD is %i\n", m); //上面的算法n=0时m这时的值就是最大公约数 printf ("The LCM is %i\n", p/m);//两数的积除以最大公约数就是最小公倍数了 return 0; }