C#求两个正整数的最大公约数和最小公倍数

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;
        }

    }
}

在这里插入图片描述

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1024节

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值