两个(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);
}
}
}
我对如何使这个算法更有效感兴趣。
答案 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
我们可以得出结论
b可以除以a,比方说(b == n * a);
b必须大于a,因为101是素数。 并且它不能是3/7/9倍,因为103/107/109也是素数,但是让我们忽略它以使for循环更简单。这可以在以下代码的内部循环中轻松处理。
所以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个嵌套循环,您将避免每个步骤进行两次除法运算。