1.第一种
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace lianxi
{
class Program
{
static void Main(string[] args)
{
/* 1)最大公约数(最大公因数):几个数公有的因数中最大的一个。
例"12与18
12的因数: 1,12,2,6,3,4
18的因数: 1,18,2,9,6,3
公有因数: 1, 2, 3,6,
12与18的最大公约数:6
2)最小公倍数:几个数公有的倍数中最小的一个。
例4和6
4的倍数: 4,8,12,16,20,24,
6的倍数: 6,12,18,24,
4和6的最小公倍数: 12
3)辗转相除法(欧几里得算法):用于计算两个非负整数a,b的最大公约数。
两数为a、b(b <a),用辗转相除法,求它们最大公约数(a、b)的步骤如下:
1997 / 615 = 3 (余 152)
615 / 152 = 4 (余7)
152 / 7 = 21 (余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 / 1 = 2 (余0)
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。
关于辗转相除法的详解可以百度搜索。
* */
//题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
int num1, num2, temp, a, b;
Console.WriteLine("请输入第一个数:");
num1 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入第二个数:");
num2 = Convert.ToInt32(Console.ReadLine());
//辗除法求其最大公约数
//被除数必须是两数中最大的,如果不是就交换位置
if (num1 < num2)
{
temp = num1;
num1 = num2;
num2 = temp;
}
a = num1;
b = num2;
while (b != 0)//求最大公约数
{
temp = a % b;
a = b;
b = temp;
}
//输出最大公约数
Console.WriteLine("输出最大公约数" + a);
//输出最小公倍数=俩数相乘÷最大公约数
Console.WriteLine("输出最小公倍数" + num1 * num2 / a);
Console.ReadKey();
}
}
}
2.第二种
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace lianxi
{
class Program
{
static void Main(string[] args)
{
int num1, num2;
Console.WriteLine("请输入第一个数:");
num1 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入第二个数:");
num2 = Convert.ToInt32(Console.ReadLine());
int GCD = greatestCommonDivisor(num1, num2);
int LCM = leastCommonMultiple(num1, num2);
Console.WriteLine("最大公约数:" + GCD+ "\n最大公倍数:"+LCM);
/* 最大公约数,GCD 最大公倍数:LCM
greatest common divisor 最大公约数
least common multiple 最小公倍数*/
}
/// <summary>
/// 最大公约数 这两个数公有的因数中最大的一个。
/// </summary>
/// <param name="num1">第一个数</param>
/// <param name="num2">第二个数</param>
/// <returns>最大公约数</returns>
static int greatestCommonDivisor(int num1, int num2)
{
int i;
for (i = num1 < num2 ? num1 : num2; i > 0; i--) //从两个数中小的开始循环,让i--
{
int numA = num1 % i;//让num1和num2同时余i,i以此递减,截至到1
int numB = num2 % i;//余i等于0,则i为因数。因为是倒序求余,只需要求出两个数第一次同时余i等于零即可。
if (numA == 0 && numB == 0) //若两个数求余同时等于零,就让它跳出循环,并且返回最大公约数i
{
break;
}
}
return i;
}
/// <summary>
/// 最小公倍数 两个数公有的倍数中最小的一个。
/// </summary>
/// <param name="num1">第一个数</param>
/// <param name="num2">第二个数</param>
/// <returns>最小公倍数</returns>
static int leastCommonMultiple(int num1, int num2)
{
int i;
for (i = num1 > num2 ? num1 : num2; i > 0; i++) //从两个数中小的开始循环,让i--
{
int numA = i % num1;
int numB = i % num2;
if (numA == 0 && numB == 0) //若两个数求余同时等于零,就让它跳出循环,并且返回最大公倍数i
{
break;
}
}
return i;
}
}
}