(1)相减法
① 若a>b,则a=a-b
② 若a<b,则b=b-a
③ 若a=b,则a(或b)即为两数的最大公约数,结束
④ 若a≠b,则再回去执行①
(2)穷举法:
① i= a b中的小数
② 若a,b能同时被i整除,则i即为最大公约数,结束
③ i--,再回去执行②
(3)辗转相除法
① a%b得余数temp
② 若temp=0,则b即为两数的最大公约数,结束
③ 若temp≠0,则a=b,b=temp,再回去执行①
/**三种方法求最大公约数.cpp : 定义控制台应用程序的入口点。
程序说明:使用辗转相除法、穷举法、相减法求两数的最大公约数。
编译环境:win10
编译者:软工1502班 苟同飞
编译日期:2017-3-19
**/
#include"stdio.h"
#include"stdafx.h"
#include<stdlib.h> /*其它说明*/
#include"math.h"//数学函数的头文件
using namespace std;
void Decrease();//相减法求最大公约数
void Method();//穷举法求最大公约数
void Stein();//辗转相除法求最大公约数
void Decrease()//Euclidean函数的定义
{
int a, b;
printf("请输入两个正整数:");
scanf("%d%d", &a, &b);
a = (int)fabs(a);
b = (int)fabs(b);//确保下面运算时a和b大于0;
do
{
if (a>b) { a = a - b; }
if (a<b) { b = b - a; }
if (a = b) { break; }
} while (a = b);
printf("最大公约数是:%d\n", a);
}
void Method()//穷举法函数的定义
{
int i;
int a, b;
printf("请输入两个正整数:");
scanf("%d%d", &a, &b);
a = (int)fabs(a);
b = (int)fabs(b);//确保下面运算时a和b大于0;
i = (a>b) ? a : b;
while (a%i != 0 || b%i != 0)
i--;
printf("最大公约数是:%d\n", i);
}
void Stein()//Stein函数的定义
{
int a, b, temp;
printf("输入数据:");
scanf("%d %d", &a, &b);
a = (int)fabs(a);
b = (int)fabs(b);//确保下面运算时a和b大于0;
if (a<b)
{
temp = a;
a = b;
b = temp;
}
while (b != 0)
{
temp = a%b;
a = b;
b = temp;
}
printf("最大公约数为:%d\n", a);
}
int main()//界面
{
int k = 1;
while (k)
{
int num;
printf("*******请选择使用的算法********\n");
printf("************1.相减法***********\n");
printf("************2.穷举法***********\n");
printf("**********3.辗转相除法*********\n");
printf("**********4.退出程序**********\n");
printf("请输入选择的功能:");
scanf("%d", &num);
switch (num)
{
case 1: Decrease(); break;
case 2: Method(); break;
case 3: Stein(); break;
case 4:k = 0; break;
default:printf("请重新输入!\n");
}
}
system("pause");
return 0;
}