C#找到最大的公约数

use*_*261 19 c# math

"两个整数的最大公约数是最大的整数,它将两个数字中的每一个均分.写入方法Gcd返回两个整数的最大公约数.将方法合并到一个应用程序中,该用户从用户读取两个值并显示结果."

(这不是作业,只是我正在使用的书中的练习)

你能帮我解决这个问题吗?这是我到目前为止所得到的.谢谢

(编辑 - 我可以提交两个号码,但不会为我计算Gcd)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Greatest_Common_Divisor
{
class Program
{

    static int GetNum(string text)
    {
        bool IsItANumber = false;
        int x = 0;
        Console.WriteLine(text);

        do
        {
            IsItANumber = int.TryParse(Console.ReadLine(), out x);

        } while (!IsItANumber);

        return x;
    }
    static void Main(string[] args)
    {
        string text = "enter a number";
        int x = GetNum(text);
        text = "enter a second number";
        int y = GetNum(text);


        int z = GCD(x, y);
        Console.WriteLine(z);
    }

    private static int GCD(int x, int y)
    {
        int v = 0;
        int n = 0;

        v = GetGreatestDivisor(x, y);


        return v;

    }

    static int GetGreatestDivisor(int m, int h)
        {

            do
            {
                for (int i = m; i <= 1; i--)



                    if (m%i == 0 && h%i == 0)
                    {
                        int x = 0;
                        x = i;

                        return x;
                    }
            } while (true);
            return m;
        }

  }
}
Run Code Online (Sandbox Code Playgroud)

Dre*_*kes 38

这是Euclidean算法的一个实现,它返回最大公约数而不执行任何堆分配.

您也可以替换ulonguint如果需要的话.使用无符号类型,因为该技术不适用于有符号值.如果您知道自己ab值不是负数,则可以使用longint替代.

private static ulong GCD(ulong a, ulong b)
{
    while (a != 0 && b != 0)
    {
        if (a > b)
            a %= b;
        else
            b %= a;
    }

    return a == 0 ? b : a;
}
Run Code Online (Sandbox Code Playgroud)

此方法用于我的元数据提取器库,它具有关联的单元测试.

  • 这是页面上的最佳答案; 它没有做任何昂贵和无关的递归调用,并且实际上回答了OP的特定问题(不同于其他一些答案,这些答案由于某种原因而偏离了GCD的一组). (3认同)
  • 他们计算集合的GCD,因为他们从单独问题的答案中复制并粘贴他们不理解的代码. (2认同)
  • 干净整洁 - 没有LINQ汤混合在一起.正是这样,我正在寻找自己的小"困境".:d (2认同)
  • 哦,这对于负输入也可以正常工作:只需在进入while循环之前翻转负值的符号... if(a <0)a = -a; 如果(B <0)B = -b; (2认同)

Kar*_*son 15

使用LINQ的Aggregate方法:

static int GCD(int[] numbers)
{
    return numbers.Aggregate(GCD);
}

static int GCD(int a, int b)
{
    return b == 0 ? a : GCD(b, a % b);
}
Run Code Online (Sandbox Code Playgroud)

注意:上面的答案借用了一组超过2个整数的最大公约数的公认答案.

  • 这是不正确的.您无法将此答案拆分为LINQ和非LINQ,解决方案是两种方法协同工作.第一种方法是在Aggregate调用中调用第二种方法,这有点令人困惑,因为名称是相同的. (8认同)
  • 回答这个问题非常好,卡尔.你的答案确实不对. (3认同)

小智 6

尝试这个:

public static int GCD(int p, int q)
{
    if(q == 0)
    {
         return p;
    }

    int r = p % q;

    return GCD(q, r);
}
Run Code Online (Sandbox Code Playgroud)


Rah*_*thi 5

你可以试试这个: -

static int GreatestCommonDivisor(int[] numbers)
{
    return numbers.Aggregate(GCD);
}

static int GreatestCommonDivisor(int x, int y)
{
return y == 0 ? x : GCD(y, x % y);
}
Run Code Online (Sandbox Code Playgroud)