【问题标题】:Is there better way of iteration to find the evenly divisible number?有没有更好的迭代方法来找到可整除的数?
【发布时间】:2019-08-17 11:00:03
【问题描述】:

我正在尝试解决这个问题: "2520 是可以除以 1 到 10 的每个数字而没有余数的最小数字。

能被 1 到 20 的所有数整除的最小正数是多少?"

请不要告诉我答案,我真的很想自己解决。我需要的只是关于问题数学方面的建议。问题是每个周期添加一个并不是一个好主意,因为这个过程太慢了。还是变量类型不长有问题?

我试图得到可以被 (1 和 10) 甚至 (1 和 17) 之间的所有数字整除的数字,并且算法运行良好。

int in_num = 1;
int score = 0;
public void calculate() {
    while (true) {
        score = 0;
        for (int x = 1; x < 21; x++) {
            if ((in_num%x) == 0) {
                score++;
            }
        }
        System.out.println("Number " + in_num + " has " + score );
        if (score == 20) {
            System.out.println(in_num);
            break;
        }
        in_num++;
    }

我期望特定的整数,但我得到了无限循环。

【问题讨论】:

  • "还是变量类型不长有问题?" - 答案是可以表示为int 的数字吗?提示:您可以测试...当您增加 in_num
  • 另外,我可以建议您使用拼写检查器吗?第一个版本的标题中有三个拼写错误。而且代码的缩进搞砸了。
  • 问题是我还没有答案,因为循环不会停止。但是数字 232775004 是循环数字的示例,似乎可用于 java 中的 int 类型。
  • 是什么让你这么想?你检查过int 的最大允许值是多少?
  • 从 1 到 20 的所有数字中最小的可整除数将是从 1 到 20 的所有数字的 LCM。

标签: java algorithm math


【解决方案1】:

这还不够吗?

将 1 到 20 的每个质数相乘,得到这个数字!用 16 代替 2,用 9 代替 3。

Long number = 2 ^ 4 * 3 ^ 2 * 5 * 7 * 11 * 13 * 17 * 19L;
System.out.println(number);

详细回答:

我们需要找到每个小于 20 的素数。然后,对于每个素数,我们必须计算在它小于 20 的情况下我们可以对素数求幂的数。

例如,如果我们将 2 与自身相乘四次,它仍然低于 20 (16)。但是如果我们计算 2 到 5 次,就会是 32,大于 20。

我们将对每个其他素数做同样的事情。通过这个计算,实际的答案是这样的:

Long number = 2 ^ 4 * 3 ^ 2 * 5 ^ 1 * 7 ^ 1 * 11 ^ 1 * 13 ^ 1 * 17 ^ 1 * 19L ^ 1;

【讨论】:

  • 请您解释一下为什么我们应该乘以 2 ^ 4 和 3 ^ 2 而不是 2 和 3。谢谢。
  • 我更新了答案。虽然,科学的答案是@matt-timmermans。这是一个简单易懂的答案。
【解决方案2】:

xy两个数的最小公倍数是xy/GCD(x,y),其中GCD 计算最大公约数。

您可以使用欧几里得算法或二进制 GCD 算法轻松实现 GCD:https://en.wikipedia.org/wiki/Greatest_common_divisor

算法如下:

result = 1;
for (x = 20; x > 0; --x)
    result *= (x/GCD(x,result));

当然,这也适用于其他数字。如果您真的不在乎,那么您可以打印 232792560

【讨论】:

    【解决方案3】:

    由于 int (in_num) range 超出了它的长度,您将陷入无限循环;将 int 类型替换为 Long(比 int 更大的东西),您将不会得到任何无限循环,而是会得到输出。

    【讨论】:

    • 谢谢,我只是认为int,即2 147 483 647就足够了。
    猜你喜欢
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多