使算法更有效率

时间:2018-06-02 07:39:38

标签: c# algorithm

两个(2位)数字一起写入,因此它们形成一个4位数字。这个4位数可以除以这两个数的乘积。问题是我必须找到这个数字。

我写了一个算法并获得了两对这些数字。

1)13和52,因此1352可以除以13 * 52。

2)17和34,所以1734可以除以17 * 34。

我的算法如下所示:

for (int i = 1010; i <= 9999; i++)
{
    int mult = (i / 100) * (i % 100);

    if ((i % 100) > 9 && i % mult == 0)
    {
        Console.WriteLine(i / 100 + " <--> " + i % 100);
    }
}

编辑:使用此算法(基于mentallurg答案)我发现这个数字更快一点

for (int i = 10; i < 99; i++)
{
    for (int j = 10; j < 99; j++)
    {
        int mult = i * j;
        int num = i * 100 + j;

        if (num % mult == 0)
        {
           Console.WriteLine(i + " <--> " + j);
        }
    }
}

我对如何使这个算法更有效感兴趣。

3 个答案:

答案 0 :(得分:2)

这非常有效:

var query =
    from x in Enumerable.Range(10, 90)
    from n in Enumerable.Range(1, 10).TakeWhile(w => w * x < 100)
    let v = x * (100 + n)
    where v % (n * x * x) == 0
    select new { x, y = n * x };

它计算所有可能的第一个数字。然后计算所有可能的第二个数字,这些数字是第一个数字的倍数,大于零且小于100.然后在检查时产生一个候选值,如果它可以被两个数字的乘积整除。

它给出了两种可能的答案。

这里使用for循环等效:

for (int x = 10; x <= 99; x++)
{
    for (int n = 1; x * n < 100; n++)
    {
        var j = x * n;
        int v = x * 100 + j;
        int d = x * j;
        if (v % d == 0)
        {
            Console.WriteLine(x + " <--> " + j);
        }
    }
}

答案 1 :(得分:1)

假设其中一对是a和b,因此四位数可以表示为100a + b。做一点数学

100a + b = m * a * b

双方分开,我们有

100 + b / a = m * b

我们可以得出结论

  1. b可以除以a,比方说(b == n * a);

  2. b必须大于a,因为101是素数。 并且它不能是3/7/9倍,因为103/107/109也是素数,但是让我们忽略它以使for循环更简单。这可以在以下代码的内部循环中轻松处理。

  3. 所以for循环可以像这样编写

    for (int a = 10; a < 50; a++)
    {
        for (int n = 2; n * a < 100; n++)
        {
            if ((100 + n) % (n * a) == 0)
                Console.WriteLine(a + " " + n * a);
        }
    }
    

    循环的迭代次数从几万次减少到几十次。

答案 2 :(得分:-1)

使用1到99的2个嵌套循环,您将避免每个步骤进行两次除法运算。