#求两个正整数的最大公约数和最小公倍数
基本要求:
1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。
提高要求:
1.三种以上算法解决两个正整数最大公约数问题。
2.求3个正整数的最大公约数和最小公倍数。
/*
author@田晨
2018/9/7
要求:
一、求两个数的最大公约数和最小公倍数
二、求三个正整数的最大公约数和最小公倍数
思想:
*求最大公约数 *
1.相减法:
输入两整数a和b,
(1)如果a>b,a=a-b;
(2)如果a<b,b=b-a;
(3)如果a=b,a或b就为这两个整数的最大公约数;
(4)如果a!=b,则再执行(1)或(2).
2.穷举法:
输入两个整数a和b,
(1)定义temp;
(2)如果a>b,则temp=b;
(3)如果a<b,则temp=a;
(4)如果a%temp||b%temp!=0,则执行temp--;
(5)如果a%temp&&b%temp==0,则temp为最大公约数.
3.辗转相除法:
输入两个整数a和b,
(1)如果a%b=temp,temp为0,则b为两数的最大公约数;
(2)如果temp!=0,则令a=b,b=temp,执行(1).
*最小公倍数*
两数之积/两数的最大公约数=其最小公倍数
*求三个整数的最大公约数和最小公倍数*
类似上面的穷举法
*/
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
int fun1(int a,int b) {
while(a!=b) {
if(a>b)a-=b;
else b-=a;
}
return a;
}
int fun2(int a,int b) {
int temp;
if(a>b)temp=b;
else temp=a;
while(a%temp!=0||b%temp!=0) {
temp--;
}
return temp;
}
int fun3(int a,int b) {
int temp;
if(a<b) {
temp=a;
a=b;
b=temp;
}
while(b!=0) {
temp=a%b;
a=b;
b=temp;
}
return abs(a);
}
int fun4(int a,int b) {
int temp;
temp=a*b/fun1(a,b);
return temp;
}
int fun5(int a,int b,int c) {
int temp,res;
int x;
temp=a;
if(temp>b)temp=b;
if(temp>c)temp=c;
for(x=1; x<=temp; x++) {
if(a%x==0&&b%x==0&&c%x==0) {
res=x;
}
}
return res;
}
int fun6(int a,int b,int c) {
int temp=1;
while(1) {
if(temp%a==0&&temp%b==0&&temp%c==0)break;
else temp++;
}
return temp;
}
void menu(){
printf(" *********************************************************\n");
printf(" # #\n");
printf(" # 求最大公约数和最小公倍数 #\n");
printf(" # #\n");
printf(" # 版本 : v1.0 #\n");
printf(" # #\n");
printf(" *********************************************************\n");
printf(" # #\n");
printf(" # 1.相减法 #\n");
printf(" # #\n");
printf(" # 2.穷举法 #\n");
printf(" # #\n");
printf(" # 3.辗转相除法 #\n");
printf(" # #\n");
printf(" # 4.求三个整数 #\n");
printf(" # #\n");
printf(" # 0.退出系统 #\n");
printf(" # #\n");
printf(" **********************************************************\n");
printf("\n");
}
int main() {
int a1,b1,i;
int a2,b2,c2;
menu();
do {
printf("请选择你要使用的功能:\n");
scanf("%d",&i);
switch(i) {
case 1:
system("cls");
menu();
printf("相减法:\n");
printf("请输入两个整数,用空格分开:\n");
scanf("%d %d",&a1,&b1);
printf("%d 与 %d 的最大公约数为 %d 最小公倍数为 %d\n\n",a1,b1,fun1(a1,b1),fun4(a1,b1)) ;
break;
case 2:
system("cls");
menu();
printf("穷举法:\n");
printf("请输入两个整数,用空格分开:\n");
scanf("%d %d",&a1,&b1);
printf("%d 与 %d 的最大公约数为 %d 最小公倍数为 %d\n\n",a1,b1,fun2(a1,b1),fun4(a1,b1)) ;
break;
case 3:
system("cls");
menu();
printf("辗转相除法:\n");
printf("请输入两个整数,用空格分开:\n");
scanf("%d %d",&a1,&b1);
printf("%d 与 %d 的最大公约数为 %d 最小公倍数为 %d\n\n",a1,b1,fun3(a1,b1),fun4(a1,b1)) ;
break;
case 4:
system("cls");
menu();
printf("三个整数:\n");
printf("请输入三个整数,用空格分开:\n");
scanf("%d %d %d",&a2,&b2,&c2);
printf("%d 、 %d 、 %d 的最大公约数为 %d 最小公倍数为 %d \n\n",a2,b2,c2,fun5(a2,b2,c2) ,fun6(a2,b2,c2));
break;
}
} while(i);
}